如何檢測SQL是否使用C#安裝在本地計算機上?是否可以檢查遠程機器?使用C#檢測本地SQL Server安裝(32位以及64位)
回答
您可以使用System.Management命名空間檢查服務器正在運行的服務中是否存在SQL Server。
您可以檢查註冊表路徑
HKEY_LOCAL_MACHINE \ SOFTWARE \微軟\ Microsoft SQL Server的\ InstalledInstances
有關的代碼,做類似的工作示例,請參閱本quesion how-to-get-sql-server-installation-path-programatically
也請參閱MSDN :File Locations for Default and Named Instances of SQL Server以獲取有關SQL Server使用的註冊表項的更多詳細信息。
ouch在我之前:-) – 2009-08-03 10:06:46
我們檢查註冊表對於
Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\CurrentVersion", ", "0.0.0.0");
你需要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。
您可以打開機器的連接並關閉它。如果你拋出異常,這是一個體面的標誌。我意識到這不是超級清潔,但它會完成工作。
也許你會發現以下有用的。使用第一種方法查找有關服務器(本地&網絡),然後您可以使用第二種方法枚舉每臺服務器上的數據庫。
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, 德揚
非常感謝給德揚Stanič。
,我想加入更多的搜索條件:
檢查的SQL Server 2008安裝在本地計算機上的.NET的SqlClient
你有幾種方法可以做到這一點:
- SmoApplication.EnumAvailableSqlServers()
- SqlDataSourceEnumerator.Instance
- d直接訪問系統註冊表
直接訪問不是MS推薦的解決方案,因爲他們可以更改密鑰/路徑。但其他解決方案無法在64位平臺上提供實例。
因此我寧願檢查系統註冊表中的SQL Server實例。這樣做,請記住x86和x64平臺之間的註冊表訪問差異。 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
- 1. 包括SQL Server緊湊安裝Win 7的32位和64位
- 2. 從32位WIX安裝程序中檢測64位系統
- 3. 在64位系統上檢測32位程序的安裝
- 4. windows 7 64位安裝32位流星
- 5. 32位和64位安裝項目
- 6. 安裝Pygame - 32位和64位
- 7. 安裝32位和64位綁定
- 8. 在64位上安裝python 32位Kubuntu
- 9. 32位ODBC和64位SQL Server
- 10. 使用註冊表檢測安裝的MS Office是32位還是64位
- 11. 在64位Fedora上安裝32位Python
- 12. 如何使用NSIS腳本檢測Windows 32位或64位?
- 13. 是否可以在bash腳本中檢測32位與64位?
- 14. 64位機器上的SQL Server 2012 32位或64位?
- 15. 64位Windows + 64位SQL Server的32位OSQL問題
- 16. 安裝了32位安裝的Python,顯示爲64位
- 17. 允許用戶在64位窗口上安裝32位版本
- 18. MATLAB:編譯64位Windows 64位安裝的32位共享庫安裝了64位MATLAB
- 19. 無法在Server 2008 R2 64位上使用asnet_regiis.exe安裝32位應用程序
- 20. 32位或64位?使用C代碼
- 21. 如何檢查我的Perl安裝是32位還是64位?
- 22. 檢查已安裝的mingw平臺,32位或64位
- 23. 如何檢查安裝的wxPython是32位還是64位?
- 24. 如何檢查安裝的Anaconda是32位還是64位?
- 25. 在64位和32位系統中查找SQL Server工具安裝路徑
- 26. 如何在Windows 64位上使用SQL Server Compact Edition 32位?
- 27. 我可以將64位SQL Server作爲32位運行嗎?
- 28. 在64位RHEL上安裝32位庫(glibc)而不使用yum
- 29. 使用Wix安裝32位和64位驅動程序?
- 30. 如何在64位PHP安裝中使用32位整數?
添加的SQL服務器的標籤,因爲這問題確實與SQL Server有關 – StevenMcD 2009-08-03 09:59:01
特定版本?任何版本? bitness是重要的(32位還是64位)?版本?它的實際運行是否重要?如果你能夠訪問它,這有什麼關係嗎?你究竟需要找出什麼? 「安裝與否」並不像看起來那麼明確。 – Sander 2009-08-03 10:00:29
如果你不花時間制定一個好問題,不要指望別人花時間來回答它。 – 2009-08-03 10:03:28