2009-06-19 46 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身份驗證。

相關問題