2009-08-03 40 views
3

如何檢測SQ​​L是否使用C#安裝在本地計算機上?是否可以檢查遠程機器?使用C#檢測本地SQL Server安裝(32位以及64位)

+0

添加的SQL服務器的標籤,因爲這問題確實與SQL Server有關 – StevenMcD 2009-08-03 09:59:01

+2

特定版本?任何版本? bitness是重要的(32位還是64位)?版本?它的實際運行是否重要?如果你能夠訪問它,這有什麼關係嗎?你究竟需要找出什麼? 「安裝與否」並不像看起來那麼明確。 – Sander 2009-08-03 10:00:29

+2

如果你不花時間制定一個好問題,不要指望別人花時間來回答它。 – 2009-08-03 10:03:28

回答

1

您可以使用System.Management命名空間檢查服務器正在運行的服務中是否存在SQL Server。

2

我們檢查註冊表對於

Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\CurrentVersion", ", "0.0.0.0"); 
1

你需要SQL 2005向後兼容性REDIST。 請參閱:How to Connect to Sqlserver2008 using SMO any workaround has to be done?

using Microsoft.SqlServer.Management.Smo; 

DataTable dt = SmoApplication.EnumAvailableSqlServers(true); 
     string[] szSQLInstanceNames = new string[dt.Rows.Count]; 
     StringBuilder szSQLData = new StringBuilder(); 

     if (dt.Rows.Count > 0) 
     { 
      int i = 0; 
      foreach (DataRow dr in dt.Rows) 
      { 
       try 
       { 
        szSQLInstanceNames[i] = dr["Name"].ToString(); 
        Server oServer; 
        oServer = new Server(szSQLInstanceNames[i]); 
        if (string.IsNullOrEmpty(dr["Instance"].ToString())) 
        { 
        szSQLInstanceNames[i] = szSQLInstanceNames[i] + "\\MSSQLSERVER"; 
        } 
        szSQLData.AppendLine(szSQLInstanceNames[i] + " Version: " + oServer.Information.Version.Major + " Service Pack: " + oServer.Information.ProductLevel + " Edition: " + oServer.Information.Edition + " Collation: " + oServer.Information.Collation); 
       } 
       catch (Exception Ex) 
       { 
        szSQLData.AppendLine("Exception occured while connecting to " + szSQLInstanceNames[i] + " " + Ex.Message); 
       } 

       i++; 
      } 

注意:如果你只是想看看是否安裝默認intance或不只是做:

服務器O服務器; oServer = new Server(Environment.MAchineName);

如果不引發異常,則存在SQL。

0

您可以打開機器的連接並關閉它。如果你拋出異常,這是一個體面的標誌。我意識到這不是超級清潔,但它會完成工作。

1

也許你會發現以下有用的。使用第一種方法查找有關服務器(本地&網絡),然後您可以使用第二種方法枚舉每臺服務器上的數據庫。

using System; 
using System.Collections.Generic; 
using System.Data.Sql; 
using System.Data; 
using System.Data.SqlClient; 

namespace Info.Data.Engine.SQLServer 
{ 
    public static class SQLServerHelper 
    { 
    public static List<String> EnumerateServers() 
    { 
     var instances = SqlDataSourceEnumerator.Instance.GetDataSources(); 
     if ((instances == null) || (instances.Rows.Count < 1)) return null; 

     var result = new List<String>(); 
     foreach (DataRow instance in instances.Rows) 
     { 
     var serverName = instance["ServerName"].ToString(); 
     var instanceName = instance["InstanceName"].ToString(); 
     result.Add(String.IsNullOrEmpty(instanceName) ? serverName : String.Format(@"{0}\{1}", serverName, instanceName)); 
     } 
     return result; 
    } 

    public static List<String> EnumerateDatabases(String connectionString) 
    { 
     try 
     { 
     using (var connection = new SqlConnection(connectionString)) 
     { 
      connection.Open(); 
      var databases = connection.GetSchema("Databases"); 
      connection.Close(); 
      if ((databases == null) || (databases.Rows.Count < 1)) return null; 

      var result = new List<String>(); 
      foreach (DataRow database in databases.Rows) 
      { 
      result.Add(database["database_name"].ToString()); 
      } 
      return result; 
     } 
     } 
     catch 
     { 
     return null; 
     } 
    } 
    } 
} 

HTH, 德揚

0

非常感謝給德揚Stanič。
,我想加入更多的搜索條件:

檢查的SQL Server 2008安裝在本地計算機上的.NET的SqlClient

4

你有幾種方法可以做到這一點:

  • SmoApplication.EnumAvailableSqlServers()
  • SqlDataSourceEnumerator.Instance
  • d直接訪問系統註冊表

直接訪問不是MS推薦的解決方案,因爲他們可以更改密鑰/路徑。但其他解決方案無法在64位平臺上提供實例。

因此我寧願檢查系統註冊表中的SQL Server實例。這樣做,請記住x86x64平臺之間的註冊表訪問差異。 Windows 64位將數據存儲在系統註冊表的不同部分,並將它們組合到視圖中。因此,使用RegistryView(自.NET 4起可用)至關重要。

using Microsoft.Win32; 

RegistryView registryView = Environment.Is64BitOperatingSystem ? RegistryView.Registry64 : RegistryView.Registry32; 
using (RegistryKey hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, registryView)) 
{ 
    RegistryKey instanceKey = hklm.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL", false); 
    if (instanceKey != null) 
    { 
     foreach (var instanceName in instanceKey.GetValueNames()) 
     { 
      Console.WriteLine(Environment.MachineName + @"\" + instanceName); 
     } 
    } 
} 

如果您正在尋找32位的情況下在64位操作系統(很奇怪,但可能),你將需要尋找:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server 
相關問題