Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何列出本地计算机上安装的SQL Server实例?(仅限本地)_C#_Sql Server - Fatal编程技术网

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

C# 如何列出本地计算机上安装的SQL Server实例?(仅限本地),c#,sql-server,C#,Sql Server,我想知道是否有办法列出本地计算机上安装的SQL Server实例 SqlDataSourceEnumerator和EnumAvailableSqlServers不需要使用本地网络上的实例,因此不需要使用此技巧。您可以使用注册表在本地系统中获取sql server实例名 private void LoadRegKey() { RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\M

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


SqlDataSourceEnumerator
EnumAvailableSqlServers
不需要使用本地网络上的实例,因此不需要使用此技巧。

您可以使用注册表在本地系统中获取sql server实例名

private void LoadRegKey()        
{            
    RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names");            
    foreach (string sk in key.GetSubKeyNames())            
    {                
      RegistryKey rkey = key.OpenSubKey(sk);                
      foreach (string s in rkey.GetValueNames())                
      {                    
         MessageBox.Show("Sql instance name:"+s);                
      }            
    }        
}

您可以使用
localOnly=True

public static DataTable EnumAvailableSqlServers(bool localOnly)

请参见

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);
        }
    }
}
如果您正在寻找64位操作系统上的32位实例(非常奇怪,但也有可能),则需要查找:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server

结合了几种方法:

using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Smo.Wmi;
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Linq;
using Microsoft.Win32;

namespace SqlServerEnumerator
{
    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<string, Func<List<string>>> methods = new Dictionary<string, Func<List<string>>>
            {
                {"CallSqlBrowser", GetLocalSqlServerInstancesByCallingSqlBrowser},
                {"CallSqlWmi32", GetLocalSqlServerInstancesByCallingSqlWmi32},
                {"CallSqlWmi64", GetLocalSqlServerInstancesByCallingSqlWmi64},
                {"ReadRegInstalledInstances", GetLocalSqlServerInstancesByReadingRegInstalledInstances},
                {"ReadRegInstanceNames", GetLocalSqlServerInstancesByReadingRegInstanceNames},
                {"CallSqlCmd", GetLocalSqlServerInstancesByCallingSqlCmd},
            };

            Dictionary<string, List<string>> dictionary = methods
                .AsParallel()
                .ToDictionary(v => v.Key, v => v.Value().OrderBy(n => n, StringComparer.OrdinalIgnoreCase).ToList());

            foreach (KeyValuePair<string, List<string>> pair in dictionary)
            {
                Console.WriteLine(string.Format("~~{0}~~", pair.Key));
                pair.Value.ForEach(v => Console.WriteLine(" " + v));
            }

            Console.WriteLine("Press any key to continue.");
            Console.ReadKey();
        }

        private static List<string> GetLocalSqlServerInstancesByCallingSqlBrowser()
        {
            DataTable dt = SmoApplication.EnumAvailableSqlServers(true);
            return dt.Rows.Cast<DataRow>()
                .Select(v => v.Field<string>("Name"))
                .ToList();
        }

        private static List<string> GetLocalSqlServerInstancesByCallingSqlWmi32()
        {
            return LocalSqlServerInstancesByCallingSqlWmi(ProviderArchitecture.Use32bit);
        }

        private static List<string> GetLocalSqlServerInstancesByCallingSqlWmi64()
        {
            return LocalSqlServerInstancesByCallingSqlWmi(ProviderArchitecture.Use64bit);
        }

        private static List<string> LocalSqlServerInstancesByCallingSqlWmi(ProviderArchitecture providerArchitecture)
        {
            try
            {
                ManagedComputer managedComputer32 = new ManagedComputer();
                managedComputer32.ConnectionSettings.ProviderArchitecture = providerArchitecture;

                const string defaultSqlInstanceName = "MSSQLSERVER";
                return managedComputer32.ServerInstances.Cast<ServerInstance>()
                    .Select(v =>
                        (string.IsNullOrEmpty(v.Name) || string.Equals(v.Name, defaultSqlInstanceName, StringComparison.OrdinalIgnoreCase)) ?
                            v.Parent.Name : string.Format("{0}\\{1}", v.Parent.Name, v.Name))
                    .OrderBy(v => v, StringComparer.OrdinalIgnoreCase)
                    .ToList();
            }
            catch (SmoException ex)
            {
                Console.WriteLine(ex.Message);
                return new List<string>();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                return new List<string>();
            }
        }

        private static List<string> GetLocalSqlServerInstancesByReadingRegInstalledInstances()
        {
            try
            {
                // HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\InstalledInstances
                string[] instances = null;
                using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server"))
                {
                    if (rk != null)
                    {
                        instances = (string[])rk.GetValue("InstalledInstances");
                    }

                    instances = instances ?? new string[] { };
                }

                return GetLocalSqlServerInstances(instances);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                return new List<string>();
            }
        }

        private static List<string> GetLocalSqlServerInstancesByReadingRegInstanceNames()
        {
            try
            {
                // HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL
                string[] instances = null;
                using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL"))
                {
                    if (rk != null)
                    {
                        instances = rk.GetValueNames();
                    }

                    instances = instances ?? new string[] { };
                }

                return GetLocalSqlServerInstances(instances);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                return new List<string>();
            }
        }

        private static List<string> GetLocalSqlServerInstances(string[] instanceNames)
        {
            string machineName = Environment.MachineName;

            const string defaultSqlInstanceName = "MSSQLSERVER";
            return instanceNames
                .Select(v =>
                    (string.IsNullOrEmpty(v) || string.Equals(v, defaultSqlInstanceName, StringComparison.OrdinalIgnoreCase)) ?
                        machineName : string.Format("{0}\\{1}", machineName, v))
                .ToList();
        }

        private static List<string> GetLocalSqlServerInstancesByCallingSqlCmd()
        {
            try
            {
                // SQLCMD -L
                int exitCode;
                string output;
                CaptureConsoleAppOutput("SQLCMD.exe", "-L", 200, out exitCode, out output);

                if (exitCode == 0)
                {
                    string machineName = Environment.MachineName;

                    return output.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries)
                        .Select(v => v.Trim())
                        .Where(v => !string.IsNullOrEmpty(v))
                        .Where(v => string.Equals(v, "(local)", StringComparison.Ordinal) || v.StartsWith(machineName, StringComparison.OrdinalIgnoreCase))
                        .Select(v => string.Equals(v, "(local)", StringComparison.Ordinal) ? machineName : v)
                        .Distinct(StringComparer.OrdinalIgnoreCase)
                        .ToList();
                }

                return new List<string>();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                return new List<string>();
            }
        }

        private static void CaptureConsoleAppOutput(string exeName, string arguments, int timeoutMilliseconds, out int exitCode, out string output)
        {
            using (Process process = new Process())
            {
                process.StartInfo.FileName = exeName;
                process.StartInfo.Arguments = arguments;
                process.StartInfo.UseShellExecute = false;
                process.StartInfo.RedirectStandardOutput = true;
                process.StartInfo.CreateNoWindow = true;
                process.Start();

                output = process.StandardOutput.ReadToEnd();

                bool exited = process.WaitForExit(timeoutMilliseconds);
                if (exited)
                {
                    exitCode = process.ExitCode;
                }
                else
                {
                    exitCode = -1;
                }
            }
        }
    }
}
使用Microsoft.SqlServer.Management.Smo;
使用Microsoft.SqlServer.Management.Smo.Wmi;
使用制度;
使用System.Collections.Generic;
使用系统数据;
使用系统诊断;
使用System.Linq;
使用Microsoft.Win32;
命名空间SqlServerEnumerator
{
班级计划
{
静态void Main(字符串[]参数)
{
字典方法=新字典
{
{“CallSqlBrowser”,GetLocalSqlServerInstancesByCallingSqlBrowser},
{“CallSqlWmi32”,GetLocalSqlServerInstancesByCallingSqlWmi32},
{“CallSqlWmi64”,GetLocalSqlServerInstancesByCallingSqlWmi64},
{“ReadRegInstalledInstances”,GetLocalSqlServerInstancesByReadingRegInstalledInstances},
{“ReadRegInstanceNames”,GetLocalSqlServerInstancesByReadingRegInstanceNames},
{“CallSqlCmd”,GetLocalSqlServerInstancesByCallingSqlCmd},
};
字典=方法
.天冬酰胺()
.ToDictionary(v=>v.Key,v=>v.Value().OrderBy(n=>n,StringComparer.OrdinalIgnoreCase.ToList());
foreach(字典中的KeyValuePair对)
{
WriteLine(string.Format(“~{0}~~”,pair.Key));
ForEach(v=>Console.WriteLine(“+v”);
}
Console.WriteLine(“按任意键继续”);
Console.ReadKey();
}
私有静态列表GetLocalSqlServerInstancesByCallingSqlBrowser()
{
DataTable dt=SmoApplication.EnumAvailableSqlServers(true);
返回dt.Rows.Cast()
.选择(v=>v.Field(“名称”))
.ToList();
}
私有静态列表GetLocalSqlServerInstancesByCallingSqlWmi32()
{
通过调用SQLWMI(ProviderArchitecture.Use32bit)返回LocalSQLServerInstances;
}
私有静态列表GetLocalSqlServerInstancesByCallingSqlWmi64()
{
通过调用SQLWMI(ProviderArchitecture.Use64bit)返回LocalSQLServerInstances;
}
私有静态列表LocalSqlServerInstancesByCallingSqlWmi(ProviderArchitecture ProviderArchitecture)
{
尝试
{
ManagedComputer managedComputer32=新的ManagedComputer();
managedComputer32.ConnectionSettings.ProviderArchitecture=ProviderArchitecture;
常量字符串defaultSqlInstanceName=“MSSQLSERVER”;
返回managedComputer32.ServerInstances.Cast()
.选择(v=>
(string.IsNullOrEmpty(v.Name)| | string.Equals(v.Name,defaultSqlInstanceName,StringComparison.OrdinalIgnoreCase))?
v、 Parent.Name:string.Format(“{0}\\{1}”,v.Parent.Name,v.Name))
.OrderBy(v=>v,StringComparer.OrdinalIgnoreCase)
.ToList();
}
捕获(SMOEX)
{
控制台写入线(例如消息);
返回新列表();
}
捕获(例外情况除外)
{
控制台写入线(ex);
返回新列表();
}
}
私有静态列表GetLocalSqlServerInstancesByReadingRegInstalledInstances()
{
尝试
{
//HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\InstalledInstances
string[]实例=null;
使用(RegistryKey rk=Registry.LocalMachine.OpenSubKey(@“SOFTWARE\Microsoft\Microsoft SQL Server”))
{
如果(rk!=null)
{
实例=(字符串[])rk.GetValue(“InstalledInstances”);
}
实例=实例??新字符串[]{};
}
返回GetLocalSqlServerInstances(实例);
}
捕获(例外情况除外)
{
控制台写入线(ex);
返回新列表();
}
}
私有静态列表GetLocalSqlServerInstancesByReadingRegInstanceNames()
{
尝试
{
//HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL
string[]实例=null;
使用(RegistryKey rk=Registry.LocalMachine.OpenSubKey(@“软件\Microsoft\Microsoft SQL Server\Instance Names\SQL”))
{
如果(rk!=null)
{
实例=rk.GetValueNames();
}
实例=实例??新字符串[]{};
}
返回GetLocalSqlServerInstances(实例);
}
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Smo.Wmi;
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Linq;
using Microsoft.Win32;

namespace SqlServerEnumerator
{
    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<string, Func<List<string>>> methods = new Dictionary<string, Func<List<string>>>
            {
                {"CallSqlBrowser", GetLocalSqlServerInstancesByCallingSqlBrowser},
                {"CallSqlWmi32", GetLocalSqlServerInstancesByCallingSqlWmi32},
                {"CallSqlWmi64", GetLocalSqlServerInstancesByCallingSqlWmi64},
                {"ReadRegInstalledInstances", GetLocalSqlServerInstancesByReadingRegInstalledInstances},
                {"ReadRegInstanceNames", GetLocalSqlServerInstancesByReadingRegInstanceNames},
                {"CallSqlCmd", GetLocalSqlServerInstancesByCallingSqlCmd},
            };

            Dictionary<string, List<string>> dictionary = methods
                .AsParallel()
                .ToDictionary(v => v.Key, v => v.Value().OrderBy(n => n, StringComparer.OrdinalIgnoreCase).ToList());

            foreach (KeyValuePair<string, List<string>> pair in dictionary)
            {
                Console.WriteLine(string.Format("~~{0}~~", pair.Key));
                pair.Value.ForEach(v => Console.WriteLine(" " + v));
            }

            Console.WriteLine("Press any key to continue.");
            Console.ReadKey();
        }

        private static List<string> GetLocalSqlServerInstancesByCallingSqlBrowser()
        {
            DataTable dt = SmoApplication.EnumAvailableSqlServers(true);
            return dt.Rows.Cast<DataRow>()
                .Select(v => v.Field<string>("Name"))
                .ToList();
        }

        private static List<string> GetLocalSqlServerInstancesByCallingSqlWmi32()
        {
            return LocalSqlServerInstancesByCallingSqlWmi(ProviderArchitecture.Use32bit);
        }

        private static List<string> GetLocalSqlServerInstancesByCallingSqlWmi64()
        {
            return LocalSqlServerInstancesByCallingSqlWmi(ProviderArchitecture.Use64bit);
        }

        private static List<string> LocalSqlServerInstancesByCallingSqlWmi(ProviderArchitecture providerArchitecture)
        {
            try
            {
                ManagedComputer managedComputer32 = new ManagedComputer();
                managedComputer32.ConnectionSettings.ProviderArchitecture = providerArchitecture;

                const string defaultSqlInstanceName = "MSSQLSERVER";
                return managedComputer32.ServerInstances.Cast<ServerInstance>()
                    .Select(v =>
                        (string.IsNullOrEmpty(v.Name) || string.Equals(v.Name, defaultSqlInstanceName, StringComparison.OrdinalIgnoreCase)) ?
                            v.Parent.Name : string.Format("{0}\\{1}", v.Parent.Name, v.Name))
                    .OrderBy(v => v, StringComparer.OrdinalIgnoreCase)
                    .ToList();
            }
            catch (SmoException ex)
            {
                Console.WriteLine(ex.Message);
                return new List<string>();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                return new List<string>();
            }
        }

        private static List<string> GetLocalSqlServerInstancesByReadingRegInstalledInstances()
        {
            try
            {
                // HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\InstalledInstances
                string[] instances = null;
                using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server"))
                {
                    if (rk != null)
                    {
                        instances = (string[])rk.GetValue("InstalledInstances");
                    }

                    instances = instances ?? new string[] { };
                }

                return GetLocalSqlServerInstances(instances);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                return new List<string>();
            }
        }

        private static List<string> GetLocalSqlServerInstancesByReadingRegInstanceNames()
        {
            try
            {
                // HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL
                string[] instances = null;
                using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL"))
                {
                    if (rk != null)
                    {
                        instances = rk.GetValueNames();
                    }

                    instances = instances ?? new string[] { };
                }

                return GetLocalSqlServerInstances(instances);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                return new List<string>();
            }
        }

        private static List<string> GetLocalSqlServerInstances(string[] instanceNames)
        {
            string machineName = Environment.MachineName;

            const string defaultSqlInstanceName = "MSSQLSERVER";
            return instanceNames
                .Select(v =>
                    (string.IsNullOrEmpty(v) || string.Equals(v, defaultSqlInstanceName, StringComparison.OrdinalIgnoreCase)) ?
                        machineName : string.Format("{0}\\{1}", machineName, v))
                .ToList();
        }

        private static List<string> GetLocalSqlServerInstancesByCallingSqlCmd()
        {
            try
            {
                // SQLCMD -L
                int exitCode;
                string output;
                CaptureConsoleAppOutput("SQLCMD.exe", "-L", 200, out exitCode, out output);

                if (exitCode == 0)
                {
                    string machineName = Environment.MachineName;

                    return output.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries)
                        .Select(v => v.Trim())
                        .Where(v => !string.IsNullOrEmpty(v))
                        .Where(v => string.Equals(v, "(local)", StringComparison.Ordinal) || v.StartsWith(machineName, StringComparison.OrdinalIgnoreCase))
                        .Select(v => string.Equals(v, "(local)", StringComparison.Ordinal) ? machineName : v)
                        .Distinct(StringComparer.OrdinalIgnoreCase)
                        .ToList();
                }

                return new List<string>();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                return new List<string>();
            }
        }

        private static void CaptureConsoleAppOutput(string exeName, string arguments, int timeoutMilliseconds, out int exitCode, out string output)
        {
            using (Process process = new Process())
            {
                process.StartInfo.FileName = exeName;
                process.StartInfo.Arguments = arguments;
                process.StartInfo.UseShellExecute = false;
                process.StartInfo.RedirectStandardOutput = true;
                process.StartInfo.CreateNoWindow = true;
                process.Start();

                output = process.StandardOutput.ReadToEnd();

                bool exited = process.WaitForExit(timeoutMilliseconds);
                if (exited)
                {
                    exitCode = process.ExitCode;
                }
                else
                {
                    exitCode = -1;
                }
            }
        }
    }
}
 public static string SetServer()
    {
        string serverName = @".\SQLEXPRESS";
        var serverNameList = SqlHelper.ListLocalSqlInstances();
        if (serverNameList != null)
        {
            foreach (var item in serverNameList)
                serverName = @"" + item;
        }
        return serverName;
    }