代码之家  ›  专栏  ›  技术社区  ›  squillman Johnny Fitz

如何将新的查询脚本与SSMS外接程序连接?

  •  3
  • squillman Johnny Fitz  · 技术社区  · 16 年前

    我正在尝试创建SSMS加载项。我要做的一件事是创建一个新的查询窗口,并通过编程将其连接到服务器实例(在SQL登录的上下文中)。我可以创建一个新的查询脚本窗口,但如果不先手动连接到其他东西(如对象资源管理器),我就找不到如何连接它。

    所以换句话说,如果我手动将obect explorer连接到一个SQL实例,然后执行外接程序创建查询窗口的方法,我可以使用以下代码将其连接:

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

    但我不想依赖currentlyActiveWndConnectionInfo.uiConnectionInfo进行连接。我想通过编程设置一个SQL登录用户名和密码。

    有人有什么想法吗?

    编辑:

    我通过将最后一个参数设置为system.data.sqlclient.sqlconnection的实例,成功地连接了查询窗口。但是,连接使用的是上次连接的登录上下文,而不是我试图通过编程设置的内容。也就是说,它所连接的用户是在“连接”对话框中选择的用户,当您单击“新建查询”按钮时,如果没有连接对象资源管理器,则会得到该用户。

    编辑2:

    我正在编写(或希望编写)一个外接程序,以便在针对生产服务器运行时自动向我们的案例跟踪系统发送SQL语句和执行结果。有一种想法是,我删除了写权限,并通过这个加载项分配了登录名,这也将迫使用户输入一个案例如果语句不在,则取消该语句。另一个想法是检查servicecache.scriptFactory.currentlyActiveWndConnectionInfo.uiConnectionInfo中的服务器名,并将其与生产服务器列表进行比较。如果匹配且没有案例,则取消查询。

    3 回复  |  直到 10 年前
        1
  •  1
  •   Mladen Prajdic    16 年前

    我找不到这样做的方法,因为似乎没有办法钩住连接对话框窗口。

    你在做什么?

    编辑: 如果我理解正确,您希望截获正在运行的查询,如果它与生产服务器匹配,请取消,否则将文本和结果发送到数据库? 隐马尔可夫模型。。。虽然这是可能的,但这是一个真正的背后的痛苦,我不会使用一个插件。此外,还可以禁用、卸载外接程序等。 您最好在生产服务器上使用适当的安全设置来完成此操作。

        2
  •  3
  •   GorkemHalulu    10 年前

    以防其他人正在以编程方式搜索创建和连接查询窗口的方法-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身份验证连接到指定的服务器和数据库。

        3
  •  1
  •   John Saunders    15 年前

    我还没试过,但不知道你是否试过。

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

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

    如果可行,请告诉我。