2012-12-12 81 views
1

我在c#(.Net 3.5)中編寫,我想獲取本地機器上安裝的SQL版本。這意味着我沒有包含地址\用戶名\密碼的連接字符串,我只需要本地機器上的SQL版本,而無需從數據庫中檢索數據等。獲取運行我的應用程序的機器上的SQL版本

我試圖使用「Microsoft.SqlServer .Management.Smo。Wmi「,但它似乎它取決於SQL版本

任何想法? 感謝,KM

編輯: 的一些注意事項,

  • 我不想的try/catch每個DLL 「Microsoft.SqlServer.Management.Smo.Wmi」(有不同的DLL 不同的SQL版本)
  • 我需要的唯一細節是我運行的機器的SQL版本爲 。
  • 我沒有連接字符串/用戶名/密碼,
+0

您可以將WMI用於SQL SERVER 2005及更高版本,但WMI無法發現SQL Server 2000。 –

+0

我正在使用'Microsoft.SqlServer.Management.Smo',但它只有以下類:'Agent','Broker'和'Mail'。我沒有看到'Wmi'。我在MSDN閱讀,我可能需要添加DLL Microsoft.SqlServer.SqlEnum.dll,但它沒有在.NET引用中列出。 – KernelMode

+0

對於2000,你不能使用Smo,它沒有'Smo'它有'Dmo'。如果你需要解決你的問題只在2005年和以上,我可以幫助你,但對於2000年,我不知道它是如何完成的。 –

回答

2

在PowerShell中試試這個:

Get-WmiObject -Namespace "root\Microsoft\SqlServer\ComputerManagement10" -Class SqlServiceAdvancedProperty -ComputerName <SERVERNAME> | Format-Table ServiceName, PropertyName, PropertyNumValue, PropertyStrValue -AutoSize 

使用root\Microsoft\SqlServer\ComputerManagement10名稱空間用於sql server 2008及更高版本,使用root\Microsoft\SqlServer\ComputerManagement替代2005。

您可以使用System.Management名稱空間從.net中實現此結果。

UPDATE

您可以用它來檢測安裝哪種類型的SQL Server WMI提供程序。

public static IEnumerable<string> EnumCorrectWmiNameSpace() 
{ 
    const string WMI_NAMESPACE_TO_USE = @"root\Microsoft\sqlserver"; 
    try 
    { 
     ManagementClass nsClass = 
      new ManagementClass(
       new ManagementScope(WMI_NAMESPACE_TO_USE), 
       new ManagementPath("__namespace"), 
       null); 

     return nsClass 
      .GetInstances() 
      .Cast<ManagementObject>() 
      .Where(m => m["Name"].ToString().StartsWith("ComputerManagement")) 
      .Select(ns => WMI_NAMESPACE_TO_USE + "\\" + ns["Name"].ToString()); 
    } 
    catch (ManagementException e) 
    { 
     Console.WriteLine("Exception = " + e.Message); 
    } 

    return null; 
} 
+0

我不知道什麼是安裝的SQL版本(2008年或2005年)。這正是我需要的。所以我不能決定使用哪個根。 – KernelMode

+0

您是否嘗試過這種解決方案? –

+1

是的。我無法調用'Cast'。我得到了以下錯誤:''System.Management.ManagementObjectCollection'沒有包含'Cast'的定義,並且沒有找到'接受'System.Management.ManagementObjectCollection'類型的第一個參數的擴展方法'Cast'使用指令或程序集引用?)' – KernelMode

0

,如果你想要得到的SQL Server Insance你的機器上安裝,你可以使用此代碼:

using Microsoft.SqlServer.Management.Smo.Wmi; 
.... 

ManagedComputer mc = new ManagedComputer(); 

foreach (ServerInstance si in mc.ServerInstances) 
{ 
    Console.WriteLine("The installed instance name is " + si.Name); 
} 

,或者如果您想要得到的SQL Server版本,你可以使用此代碼:

try 
{ 
    SqlConnection sqlConnection = new SqlConnection(connectionString); 
    Microsoft.SqlServer.Management.Smo.Server server = new Microsoft.SqlServer.Management.Smo.Server(new Microsoft.SqlServer.Management.Common.ServerConnection(sqlConnection)); 

    switch (server.Information.Version.Major) 
    { 
     case 8: 
     MessageBox.Show("SQL Server 2000"); 
     break; 
     case 9: 
     MessageBox.Show("SQL Server 2005"); 
     break; 
     case 10: 
     MessageBox.Show("SQL Server 2008"); 
       break; 
     default: 
     MessageBox.Show(string.Format("SQL Server {0}", server.Information.Version.Major.ToString())); 
     break; 
    } 
} 
catch (Microsoft.SqlServer.Management.Common.ConnectionFailureException) 
{ 
    MessageBox.Show("Unable to connect to server", 
     "Invalid Server", MessageBoxButtons.OK, MessageBoxIcon.Error); 

} 
+0

我正在使用'Microsoft.SqlServer.Management.Smo',但它只有以下類:'Agent','Broker'和'Mail'。我沒有看到'Wmi'。我在MSDN閱讀,我可能需要添加DLL Microsoft.SqlServer.SqlEnum.dll但它沒有列出.NET引用 – KernelMode

+0

@kernelMode你必須添加此引用:Microsoft.SqlServer.SqlWmiManagement –

+0

問題是,引用'Microsoft.SqlServer.SqlWmiManagement'特定於SQL版本。這意味着我需要爲所有版本和適當的包裝器添加DDL到每個DLL。我需要一種方法來檢查我正在運行的本地機器的SQL版本,而不嘗試(並捕獲)每個DLL。 – KernelMode

相關問題