【问题标题】:Creating a connected query window from Visual Studio 2012 addin从 Visual Studio 2012 插件创建连接的查询窗口
【发布时间】:2014-02-11 14:00:20
【问题描述】:

我正在尝试从 Visual Studio 2012 插件创建一个连接的查询窗口。

这是我正在使用的代码:

        UIConnectionInfo u = new UIConnectionInfo
        {
            ServerName = serverName,
            ServerType = new Guid(serverType),
            AuthenticationType = authType
        };

        u.AdvancedOptions.Set("DATABASE", databaseName);
        u.AdvancedOptions.Set("PACKET_SIZE", "4096");
        u.AdvancedOptions.Set("CONNECTION_TIMEOUT", "15");
        u.AdvancedOptions.Set("EXEC_TIMEOUT", "0");
        u.AdvancedOptions.Set("ENCRYPT_CONNECTION", "False");
        u.AdvancedOptions.Set("USE_CUSTOM_CONNECTION_COLOR", "False");
        u.AdvancedOptions.Set("CUSTOM_CONNECTION_COLOR", "-986896");

        u.ApplicationName = "Microsoft SQL Server Data Tools, T-SQL Editor";
        u.UserName = userName;

        if(authType == 1)
        {
            u.Password = password;
        }

        ScriptFactory scriptFactory = ScriptFactory.Instance;
        if(scriptFactory != null)
        {
            scriptFactory.CreateNewBlankScript(ScriptType.Sql, u, null);   
        }

UIConnectionInfo 中的所有属性都设置为与您从 Visual Studio 2012 手动打开查询窗口时完全相同的值。

scriptFactory.FileOpenMode 设置为 Connected。

我什至尝试将打开和关闭连接的 SQLConnection 对象传递给 CreateNewBlankScript(这有助于 Visual Studio 2010),但没有结果。

在其他程序集中,我引用了 SQLEditors.dll 和 SQLWorkbench.Interfaces ,它们都是 11.0 版本。

任何信息都会很有帮助。

谢谢。

【问题讨论】:

    标签: c# visual-studio-2012 visual-studio-addins new-window


    【解决方案1】:

    其中 UIConnectionInfo 和 SqlConnection 是你的连接和 queryWindow 当前打开的窗口

    private static void SetConnectionForQueryWindow(Window queryWindow, 
    UIConnectionInfo uiConnectionInfo, SqlConnection conn)
        {
            object tempQueryWindow;
            Dictionary<string, object> openedQueryWindows;
            List<Window> temp = new List<Window> { queryWindow };
    
            openedQueryWindows = GetAllOpenedQueryWindows2012(temp);
            openedQueryWindows.TryGetValue(queryWindow.Document.FullName, out tempQueryWindow);
    
            if(tempQueryWindow == null)
            {
                return;
            }
    
            Assembly sqlEditor = Assembly.LoadFrom(tempQueryWindow.GetType().Assembly.Location);
            var sqlScriptEditorControl = new SqlEditorTabbedEditorPane(sqlEditor);
            var displaySqlResultsTabControl = new DisplaySqlResultsTabControl2012(tempQueryWindow, sqlScriptEditorControl);
    
            try
            {
                var connectionStrategyField =
                    displaySqlResultsTabControl.QueryExecutorWrapper.QueryExec.GetType()
                        .GetField("_connectionStrategy", BindingFlags.Instance | BindingFlags.NonPublic);
                var connectionStrategy = connectionStrategyField.GetValue(displaySqlResultsTabControl.QueryExecutorWrapper.QueryExec);
    
                var connection = connectionStrategy.GetType()
                    .GetField("_connectionInfo", BindingFlags.Instance | BindingFlags.NonPublic);
                connection.SetValue(connectionStrategy, uiConnectionInfo);
    
                var setDbConn = connectionStrategy.GetType()
                    .GetMethod("SetDbConnection", BindingFlags.NonPublic | BindingFlags.Instance);
    
                object[] parametersArray = { conn };
                setDbConn.Invoke(connectionStrategy, parametersArray);
    
            }
            catch(NullReferenceException nullReferenceException)
            {
    
            }
        }
    
    internal static Dictionary<string, object> GetAllOpenedQueryWindows2012(List<Window> windows)
        {
            Dictionary<string, object> openedQuerySqlWindows = new Dictionary<string, object>();
            foreach(Window window in windows)
            {
                foreach(Window queryWindow in window.Document.ActiveWindow.Collection)
                {
                    if(queryWindow.Object == null)
                    {
                        continue;
                    }
    
                    if(queryWindow.Object.ToString()
                       != "Microsoft.VisualStudio.Data.Tools.SqlEditor.UI.TabbedEditor.SqlEditorTabbedEditorPane")
                    {
                        continue;
                    }
    
                    object sqlEditorTabbedEditorPane = queryWindow.Object;
                    if(!openedQuerySqlWindows.ContainsKey(queryWindow.Document.FullName))
                    {
                        openedQuerySqlWindows.Add(queryWindow.Document.FullName, sqlEditorTabbedEditorPane);
                    }
                }
            }
    
            return openedQuerySqlWindows;
        }
    

    在哪里

    public class SqlEditorTabbedEditorPane
    {
        private readonly FieldInfo m_displaySqlResultsControl;
    
        public SqlEditorTabbedEditorPane(Assembly sqlEditor)
        {
            Type sqlEditorTabbedEditorPane =
                sqlEditor.GetType(
                    "Microsoft.VisualStudio.Data.Tools.SqlEditor.UI.TabbedEditor.SqlEditorTabbedEditorPane");
            m_displaySqlResultsControl = sqlEditorTabbedEditorPane.GetField(
                "_resultsControl",
                BindingFlags.NonPublic | BindingFlags.Instance);
        }
    
        public FieldInfo DisplaySqlResultsControl
        {
            get
            {
                return this.m_displaySqlResultsControl;
            }
        }
    }
    
    public class DisplaySqlResultsTabControl2012
    {
        private readonly object m_displaySqlResultsTabControl;
    
        private readonly QueryExecutor m_queryExecutor;
    
        public DisplaySqlResultsTabControl2012(
            object scriptEditor,
            SqlEditorTabbedEditorPane sqlScriptEditorControl)
        {
            m_displaySqlResultsTabControl = sqlScriptEditorControl.DisplaySqlResultsControl.GetValue(scriptEditor);
            m_queryExecutor = new QueryExecutor(m_displaySqlResultsTabControl);            
        }
    
        public DisplaySqlResultsTabControl2012(object scriptEditor, SqlEditorTabbedEditorPane sqlScriptEditorControl)
        {
            m_displaySqlResultsTabControl = sqlScriptEditorControl.DisplaySqlResultsControl.GetValue(scriptEditor);
            m_queryExecutor = new QueryExecutor(m_displaySqlResultsTabControl);
        }
    
        public object DisplaySqlResultsTabCtr
        {
            get
            {
                return m_displaySqlResultsTabControl;
            }
        }
    
        public QueryExecutor QueryExecutorWrapper
        {
            get
            {
                return m_queryExecutor;
            }
        }
    
        public class QueryExecutor
        {
            private readonly object m_queryExecutor;
    
            public QueryExecutor(object displaySqlResultsTabControl)
            {
                FieldInfo queryExecutor = displaySqlResultsTabControl.GetType()
                    .GetField("_queryExecutor", BindingFlags.Instance | BindingFlags.NonPublic);
                if(queryExecutor != null)
                {
                    this.m_queryExecutor = queryExecutor.GetValue(displaySqlResultsTabControl);
                }
            }
    
            public object QueryExec
            {
                get
                {
                    return m_queryExecutor;
                }
            }
        }        
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-07
      • 1970-01-01
      • 1970-01-01
      • 2013-11-30
      • 1970-01-01
      • 2013-02-21
      • 1970-01-01
      相关资源
      最近更新 更多