如何列出本地计算机上安装的SQL Server实例?(仅限本地)

Ale*_*tis 21 c# sql-server

我想知道是否有办法列出本地计算机上安装的SQL Server实例.

SqlDataSourceEnumerator并且EnumAvailableSqlServers不要这样做,因为我不需要通过本地网络的实例.

Ale*_*aus 19

MS建议不直接访问Windows注册表,因为它们可以更改密钥/路径.但我同意SmoApplication.EnumAvailableSqlServers()SqlDataSourceEnumerator.Instance无法在64位平台上提供实例.

从Windows注册表获取数据,请记住x86x64平台之间注册表访问的差异.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)