2016-02-13 191 views
0

我正在完成包含SQL Server數據庫的C#中的應用程序。檢查SQL Server是否已安裝C#

如何檢查用戶是否安裝了SQL Server 2012 Express Local DB?

是否可以通過x86,x64上的註冊表進行檢查?

基本上這個想法是,如果用戶沒有安裝SQL Server,應用程序建議安裝它。

由於我正在安裝的安裝程序沒有SQL Server 2012 Express Local DB的依賴項。

謝謝。

+0

的[檢查是否是通過C#安裝在計算機上的SQL Server]可能的複製(http://stackoverflow.com/questions/2443001/check-if-sql-server-is-installed-on-a - 機器通過c-sharp) –

+0

已經嘗試過,沒有工作。該應用程序是32位和OS 64位。 –

+0

不是直接的答案,但是將存儲的應用程序數據替換爲SQLite會不會更好? – trailmax

回答

3

您必須遍歷卸載GUID並找到一個以關鍵字「Microsoft SQL Server 2012」開頭的GUID。您可以通過控制面板>程序和功能>找到它並查看「顯示名稱」列。

// HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \微軟\的Windows \ CurrentVersion \卸載{guidVariable} \ DisplayName的

..應該通配符匹配 「2012 *的Microsoft SQL Server」。

我沒有確切的代碼,但這應該讓你開始。只需循環「Uninstall」鍵的所有子項,然後通過獲取該值來查找「DisplayName」鍵。下面的「GUID」變量應該是你的迭代器,因爲你不知道這個值。我相信你可以得到所有的「卸載」鍵的子鍵的GUID值列表。

string UninstallRegKeyPath = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; 
Guid UninstallGuid = new Guid(GUID); 

using (RegistryKey key = Registry.LocalMachine.OpenSubKey(UninstallRegKeyPath, true)) 
{ 
    if (key == null) 
    { 
     return; 
    } 
    try 
    { 
     string guidText = UninstallGuid.ToString("B"); 
     RegistryKey child = key.OpenSubKey(guidText); 
     if (child != null) 
     { 
     string displayName = child.GetValue("DisplayName").ToString(); 
     if (displayName.Contains("Microsoft SQL Server 2012")) 
     { 
      // implement logic when MSSQL 2012 is found 
     }  
     child.Close(); 
     } 
    } 
} 

只是要謹慎。有32位安裝和64位安裝。 Wow6432Node包含我認爲的32位程序,因此默認情況下安裝在C:\Program Files (x86)\中的所有內容(但可能在任何地方)。還有另外一個位置,我可以讓你找到所有的64位程序,它們默認安裝在C:\Program Files\(並且可能安裝在任何地方)。

編輯:

試試這個。您可能還想用「CurrentUser」替換「LocalMachine」,因爲許多安裝程序允許您爲您的用戶或所有用戶配置它們。

 using (RegistryKey root = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall")) 
     { 
      string searchKey = @"Microsoft SQL Server 2012"; 
      string subKeyName = "DisplayName"; 

      foreach (string keyname in root.GetSubKeyNames()) 
      { 
       //Console.WriteLine(keyname); 
       using (RegistryKey key = root.OpenSubKey(keyname)) 
       { 
        try // in case "DisplayName doesn't exist 
        { 
         string displayName = key.GetValue(subKeyName).ToString(); 
         if (displayName.StartsWith(searchKey)) 
          Console.WriteLine("GUID: " + keyname + Environment.NewLine + displayName + Environment.NewLine); 
        } 
        catch 
        { 

        } 

       } 
      } 
     } 

     Console.ReadLine(); 
+1

醜陋地獄,但最好的辦法可能。尼斯 - 將不得不記住;) – TomTom

+0

謝謝,會試試這個。 –

相關問題