You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 06:53:26