如何在SSMS的VSIX扩展中为活动窗口设置SQL连接?
解决SSMS VSIX扩展中活动窗口连接更新问题
你遇到的问题核心是SqlScriptEditorControl.SetConnection仅更新了控件内部状态,未同步到SSMS的全局连接上下文,导致界面和实际连接未生效。以下是可行的解决思路和代码示例:
关键思路
SSMS的连接管理依赖内部的IConnectionService服务,而非仅编辑器控件自身。需要通过该服务来同步连接变更,同时确保编辑器宿主感知到连接变化。
实现步骤
- 获取MEF容器实例:SSMS通过MEF管理内部服务,先获取容器以拿到
IConnectionService。 - 获取活动编辑器的宿主上下文:从活动窗口中提取
SqlEditorHost,它负责关联编辑器与SSMS的连接环境。 - 通过连接服务更新连接:调用
IConnectionService的方法,将UIConnectionInfo应用到活动编辑器的上下文。
代码示例
using Microsoft.SqlServer.Management.UI.VSIntegration; using Microsoft.SqlServer.Management.UI.VSIntegration.Editors; using System.ComponentModel.Composition; // 获取MEF容器实例 var compositionContainer = ServiceCache.GlobalProvider.GetService(typeof(CompositionContainer)) as CompositionContainer; if (compositionContainer == null) return; // 获取IConnectionService服务 var connectionService = compositionContainer.GetExportedValue<IConnectionService>(); if (connectionService == null) return; // 获取活动窗口及编辑器控件 Window activeWindow = activeDocument.ActiveWindow; SqlScriptEditorControl editorControl = activeWindow.Object as SqlScriptEditorControl; if (editorControl == null) return; // 获取编辑器宿主对象 var editorHost = editorControl.GetService(typeof(SqlEditorHost)) as SqlEditorHost; if (editorHost == null) return; // 准备目标连接信息 UIConnectionInfo newInfo = getUIConnectionfromRegisteredServer(newConnection); // 通过连接服务同步连接变更 connectionService.SetConnection(editorHost.ConnectionInfo, newInfo); // 触发编辑器刷新连接状态 editorControl.UpdateConnection(newInfo);
版本兼容性说明
- SSMS 19:确保引用的
Microsoft.SqlServer.Management.UI.VSIntegration等程序集版本匹配SSMS 19安装目录(通常在C:\Program Files\Microsoft SQL Server Management Studio 19\Common7\IDE\PublicAssemblies)。 - SSMS 18及更早版本:
SqlEditorHost可尝试通过editorControl.ServiceProvider.GetService(typeof(SqlEditorHost))获取,IConnectionService的核心方法签名基本一致,需验证程序集兼容性。
额外注意事项
- 确保
UIConnectionInfo的所有必要属性已正确赋值(如ServerName、AuthenticationType、DatabaseName等),否则连接变更可能失败。 - 操作需在UI线程执行,可通过
System.Windows.Application.Current.Dispatcher.Invoke包裹代码,避免跨线程异常。
内容的提问来源于stack exchange,提问作者Daniel Davis
相关产品推荐
相关产品推荐

