我想知道是否有办法列出本地计算机上安装的SQL Server实例.
SqlDataSourceEnumerator并且EnumAvailableSqlServers不要这样做,因为我不需要通过本地网络的实例.
Ale*_*aus 19
MS建议不直接访问Windows注册表,因为它们可以更改密钥/路径.但我同意SmoApplication.EnumAvailableSqlServers()和SqlDataSourceEnumerator.Instance无法在64位平台上提供实例.
从Windows注册表获取数据,请记住x86和x64平台之间注册表访问的差异.64位版本的Windows将数据存储在系统注册表的不同部分,并将它们组合到视图中.所以使用RegistryView是必不可少的.
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果您在64位操作系统上寻找32位实例(非常奇怪,但可能),您需要查看:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server
Run Code Online (Sandbox Code Playgroud)
mar*_*c_s 18
您可以使用a调用EnumAvailableSQlServers localOnly = True
public static DataTable EnumAvailableSqlServers(bool localOnly)
Run Code Online (Sandbox Code Playgroud)
请参阅EnumAvailableSqlServers的MSDN文档
Tal*_*lha 10
SqlDataSourceEnumerator instance = SqlDataSourceEnumerator.Instance;
System.Data.DataTable table = instance.GetDataSources();
foreach (System.Data.DataRow row in table.Rows)
{
if (row["ServerName"] != DBNull.Value && Environment.MachineName.Equals(row["ServerName"].ToString()))
{
string item = string.Empty;
item = row["ServerName"].ToString();
if(row["InstanceName"] != DBNull.Value || !string.IsNullOrEmpty(Convert.ToString(row["InstanceName"]).Trim()))
{
item += @"\" + Convert.ToString(row["InstanceName"]).Trim();
}
listview1.Items.Add(item);
}
}
Run Code Online (Sandbox Code Playgroud)