2011-08-25 217 views
1

我GOOGLE了一天,但問題仍然是一個問題:如何檢測SQ​​L Server 2008 R2上的各種Windows版本:檢測SQL Server 2008 R2的

  • 通過註冊表(將是我們最喜歡的溶液) ,
  • 通過 文件系統
  • ,通過安裝退出代碼

使用NSIS開發安裝程序。一些額外的信息:

註冊

樣品在網絡上已經過時或者乾脆不恰當的。不僅僅是R2而且2k8檢測也是有問題的。

文件系統

我不知道哪些文件特別是從2K8 R2。

安裝退出代碼

在一些情況下退出而不錯誤代碼(即缺少的先決條件)。

+0

謝謝大家!我們需要將它集成到NSIS安裝程序中,但是我會在測試不同環境下的解決方案後提供反饋。 – boj

回答

2

你可以使用WMI來listy安裝的所有微軟產品,然後你可以看看敵人,是一個需要

public static class MyClass 
    { 
     public static void Main() 
     { 
      ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT * FROM Win32_Product"); 
      foreach (ManagementObject mo in mos.Get()) 
      { 
       Console.WriteLine(mo["Name"]); 
      } 


     } 
    } 
+0

一個非常酷,很慢的解決方案 - 但我決定使用這個。 SELECT @@ VERSION非常流暢,但需要SQL連接。 – boj

2

嘗試執行此查詢:

SELECT @@Version 

我得到這樣的結果回:

的Microsoft SQL Server 2008 R2(RTM) - 10.50.1600.1(X64)四月2 2010 15:48:46 Copyright(c)Microsoft Corporation企業版 (64位)在Windows NT 5.2(內部版本3790:Service Pack 2)

這就夠了嗎?對我來說,是:)

+0

如果服務未啓動,該怎麼辦?你是如何確定要連接哪個實例以運行查詢的? –

+0

@Aaron,有你,看到我的其他答案 –

1

,並嘗試執行由達維德提供查詢之前(SELECT @ @版本),你可以檢查,這MSSQL服務運行

using System.ServiceProcess; 
var list = ServiceController.GetServices().ToList(); 
     if (list.Any(sc => sc.ServiceName.ToLower().Contains("mssql"))) 
+0

您仍然需要識別需要連接的實例名稱 - 因爲可能安裝了多個實例。知道至少有一項服務已經啓動並不意味着你會奇蹟般地知道分別連接到每個實例並檢查@@ VERSION。 –

+0

亞倫,你有權利,但如果你甚至知道實例名稱 - 我認爲如果MSSQL正在運行,然後執行連接比連接到服務器並等待服務器處於脫機狀態時超時更快,那麼此metod會更快。 –

+0

那麼你想要快速還是準確?關鍵是你需要知道任何已安裝實例的版本,而不管它們是否正在運行。 –

2

看看它有多種方法老SQLPing源代碼

+0

+1你需要檢查所有可能的實例,然後才能考慮檢查它們是什麼版本。 –

1

我我們下文E代碼在我的應用

SqlDataSourceEnumerator sqldatasourceenumerator1 = SqlDataSourceEnumerator.Instance; 
      DataTable datatable1 = sqldatasourceenumerator1.GetDataSources(); 
      foreach (DataRow row in datatable1.Rows) 
      { 
       if (Environment.MachineName.Equals(row["ServerName"])) 
       { 

        isSqlServerPresent = true; 
        break; 
       } 
      } 

唯一的問題是,這種代碼的工作,當機器在網絡上,但因爲在我的情況下,該機將會在網絡,所以我很確定這個問題。

它使我得到SQL Server的本地實例。