這似乎是一個相當普遍的問題,但我見過的所有答案都沒有特別令人滿意。我想獲得本地計算機上安裝的MS SQL Server實例的名稱列表,無論它們是否已啓動。爲了討論的目的,我只需找到SQL 2005和更新的實例即可;我可以使用「傳統」方法處理2000和更早版本(即查看註冊表)。我所要求的是,它不依賴於SQL Server Browser服務(它現在默認爲禁用),即使應用程序是32位,也會返回64位實例。如何獲取本地計算機上所有MS SQL Server實例的列表?
建議,我已經看到了:
挖通了註冊表:據說Not recommended由於是無證的註冊表項; MS可能會在未來改變它們。更重要的是,據我所知,MSSQL的64位實例位於64位HKLM \ SOFTWARE \ Microsoft \ Microsoft SQL Server InstalledInstances中,而32位實例位於32位實例中, bit應用程序不會看到任何64位實例。
使用上一篇博文中提到的SQL WMI Provider for Configuration Management。這似乎是最接近的,但儘管作者勸告避免使用註冊表,因爲它可能會改變,但事實證明WMI名稱空間在SQL 2005和2008之間發生了變化:2005年,它是root \ Microsoft \ SqlServer \ ComputerManagement,但在2008年它是root \ Microsoft \ SqlServer \ ComputerManagement10。未來會再度改變嗎?也就是說,如果我不得不更新我的應用程序以用於未來版本的SQL,那麼這可能不是一個大問題。
我用WMI方法的問題是SqlService類返回一個服務名稱列表,而我想要實例名稱。例如,而不是MSSQL $ INSTANCE,我只想要INSTANCE。剝離「MSSQL $」是微不足道的,正如處理默認實例的特例一樣,但是可靠嗎? AFAIK,技術上沒有理由爲什麼服務無法重命名,同時保持實例名稱相同。這就是說,除非有人有更好的方法,我想我會去(取得服務名稱並剝離MSSQL $)。 ServerSettings類返回實例名稱,但它沒有看到我的計算機上安裝的SQL 2008 R2 Express的64位實例。
使用
SmoApplication.EnumAvailableSqlServers(true)
:這似乎取決於SQL Server Browser服務。如果瀏覽器服務啓動,它會很好,但如果不是,我只會得到一行,其中計算機名稱作爲服務器名稱和空白實例名稱。使用
System.Data.Sql.SqlDataSourceEnumerator.GetDataSources()
:同樣的問題,它依賴於SQL Server瀏覽器。
那麼,還有其他一些方法可能會更好嗎?
請注意,在Windows Server 2012和Windows 8上,如果未更新到Service Pack 2(SQL Server 2008 R2 10.50.4000,Service Pack 2),則使用WMI檢測SQL Server 2008 R2的實例可能會失敗, 。它在模塊svrenumapi100.dll中失敗,由wmiprvse.exe使用 – demp 2013-08-12 12:13:49