2009-06-19 55 views
2

我正在尝试创建一个SSMS加载项。我想要做的事情之一是创建一个新的查询窗口并以编程方式将其连接到服务器实例(在SQL登录的上下文中)。我可以很好地创建新的查询脚本窗口,但是我没有先手动连接到其他的东西(比如对象浏览器),我找不到如何连接它。如何连接一个新的查询脚本与SSMS加载项?

因此,换句话说,如果我Obect资源管理器连接到SQL实例手动,然后执行我的方法加载项,创建查询窗口,我用这个代码可以把它连接:

ServiceCache.ScriptFactory.CreateNewBlankScript(
    Editors.ScriptType.Sql, 
    ServiceCache.ScriptFactory.CurrentlyActiveWndConnectionInfo.UIConnectionInfo, 
    null); 

但我不想依赖CurrentlyActiveWndConnectionInfo.UIConnectionInfo进行连接。我想以编程方式设置SQL登录用户名和密码。

有没有人有任何想法?

编辑:

我已经设法获得通过的最后一个参数设置为System.Data.SqlClient.SqlConnection的实例连接的查询窗口。但是,连接使用最后一次登录的上下文,而不是以编程方式设置。也就是说,它所连接的用户就是您在连接对话框中选择的用户,当您单击“新建查询”按钮并且没有连接对象资源管理器时,您将获得该用户。

EDIT2:

我写(或希望写)的插件时对我们的生产服务器上运行自动发送SQL语句和执行结果,以我们的情况跟踪系统。我想过的一个想法是删除写入权限并通过此加载项分配登录名,这也将强制用户输入案例#如果该语句不存在,则取消该语句。我刚才的另一个想法是检查ServiceCache.ScriptFactory.CurrentlyActiveWndConnectionInfo.UIConnectionInfo中的服务器名称,并将其与我们的生产服务器列表进行比较。如果匹配并且没有大小写#则取消查询。

+0

你想创建自己的连接到对话框? – 2009-06-19 15:20:56

+0

是的,基本上。用户不会自己输入登录信息。它将从持久存储中检索,而我已经在使用这个存储。 – squillman 2009-06-19 16:06:10

回答

1

我还没找到办法做到这一点,因为似乎没有办法挂钩到连接对话窗口。

你在做什么?

编辑: 如果我理解正确,你想拦截正在运行的查询,如果它匹配生产服务器取消它否则将文本和结果发送到数据库? 嗯...虽然这将是可能的,但在后面是一个真正的主要痛苦,我不会使用此外接程序。加上一个加载项可以禁用,卸载等。 你最好尝试在生产服务器上进行适当的安全设置。

0

我还没有试过这个,但不知道你是否给了它一枪。

Microsoft.SqlServer.Management.Smo.RegSvrEnum.UIConnectionInfo u = 
    new Microsoft.SqlServer.Management.Smo.RegSvrEnum.UIConnectionInfo(); 

应该允许你建立自己的连接。但就像我说的,我还没有测试过它。 您需要参考Microsoft.SqlServer.RegSvrEnum.dll

让我知道它是否有效。

2

万一其他人正在寻找一种方式来programmaticaly创建和连接查询窗口 - 用于SSMS 2012一短的例子:

UIConnectionInfo u =new UIConnectionInfo(); 

u.ServerName = "TestPC\\ServerInstance"; 

u.ServerType = new Guid("8c91a03d-f9b4-46c0-a305-b5dcc79ff907"); 

u.AuthenticationType = 0;//Use AuthenticationType = 1 for SQL Server Authentication 

u.AdvancedOptions.Set("DATABASE", "AdventureWorks2012"); 

IScriptFactory scriptFactory = ServiceCache.ScriptFactory; 

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

该代码段将打开连接到指定的服务器一个新的查询窗口和数据库与Windows身份验证。