【问题标题】:Check if SQL Server is installed on a machine through C#通过 C# 检查是否在计算机上安装了 SQL Server
【发布时间】:2019-05-17 01:45:55
【问题描述】:

我正在制作一个应用程序,它是一个用户界面,可以访问两种类型的数据库——SQLite 和 SQL Server。

问题是,SQLite 不需要“安装”,因为它只是一个平面文件数据库,但另一方面,SQL Server (Express/normal) 需要在使用前安装。我的问题很简单:

有没有一种方法可以通过使用 C# 程序找出 SQL Server 的实例是否已安装在本地计算机上?

【问题讨论】:

标签: c# sql-server sqlite


【解决方案1】:

你有几种方法可以做到:

  • SmoApplication.EnumAvailableSqlServers()
  • SqlDataSourceEnumerator.Instance
  • 直接访问系统注册表

直接访问不是 MS 推荐的解决方案,因为它们可以更改键/路径。但其他解决方案并不可靠,无法在 64 位平台上提供实例。

因此,我更喜欢在系统注册表中检查 SQL Server 实例。这样做,请记住 x86x64 平台之间注册表访问的差异。 Windows 64 位将数据存储在系统注册表的不同部分,并将它们组合成视图。所以使用 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

【讨论】:

    【解决方案2】:

    如果您的应用安装在有问题的机器上,您可以使用类似于以下内容的方式检查注册表:

    using Microsoft.Win32; 
    RegistryKey RK = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\MICROSOFT\Microsoft SQL Server");
        if(RK != null)
        {
           // It's there 
        }
        else
        {
           // It's not there 
        }
    

    【讨论】:

    • 看起来不错,只需在您的 OpenSubKey 参数的开头添加一个 @ 以允许使用反斜杠;)感谢您的回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多