检查是否安装了SQL服务器(任何版本)?

时间:2010-03-04 16:49:02

标签: c# sql-server

我需要查找是否在计算机上安装了SQL Server。它可以是任何版本的SQL服务器(7,2005,8,sql express等)。我们在编写安装程序时需要知道这些信息,并且需要向用户显示如果找不到SQL服务器,则无法继续安装。

我见过使用注册表,wmi,SMO或只是连接到SQL服务器实例的版本(虽然这里没有帮助,因为我们不知道服务器名称)。

我们正在使用Wix安装程序。

这样做的正确方法是什么?

JD

5 个答案:

答案 0 :(得分:16)

列出网络上所有SQL Server的一种简单方法是:

using System.Data;
using System.Data.Sql;
using System;

...

SqlDataSourceEnumerator sqldatasourceenumerator1 = SqlDataSourceEnumerator.Instance;
DataTable datatable1 = sqldatasourceenumerator1.GetDataSources();
foreach (DataRow row in datatable1.Rows)
{
    Console.WriteLine("****************************************");
    Console.WriteLine("Server Name:"+row["ServerName"]);
    Console.WriteLine("Instance Name:"+row["InstanceName"]);
    Console.WriteLine("Is Clustered:"+row["IsClustered"]);
    Console.WriteLine("Version:"+row["Version"]);
    Console.WriteLine("****************************************");
}

取自this blog post

答案 1 :(得分:2)

看一下这个问题:How can I determine installed SQL Server instances and their versions?

其中一个答案列出了您可以检查以确定已安装的SQL Server版本的注册表项。

如果您需要在本地网络中找到任何SQL Server,请查看此代码项目文章:http://www.codeproject.com/KB/database/locate_sql_servers.aspx

答案 2 :(得分:2)

我需要类似的东西,以发现一个本地SQLServer实例来执行自动化测试。

SmoApplication非常适合这个要求 - 我的代码如下所示:

public static string GetNameOfFirstAvailableSQLServerInstance()
{
    // Only search local instances - pass true to EnumAvailableSqlServers
    DataTable dataTable = SmoApplication.EnumAvailableSqlServers(true);
    DataRow firstRow = dataTable.Rows[0];
    string instanceName = (string)firstRow["Name"];
    return instanceName;
}

答案 3 :(得分:2)

另一个简单的替代方法是在安装程序中使用以下命令行:

sc queryex type= service | find "MSSQL"

上面的命令只列出了包含MSSQL部分的所有服务,列出了命名和默认的SQL Server实例。如果未找到任何内容,则此命令不返回任它返回如下内容:

SERVICE_NAME: MSSQL$SQLEXPRESS

希望这有帮助。

答案 4 :(得分:0)

另一个有用的方法,但是很晚(10年前)了:

public static bool CheckSQLInstalled()
    {
        bool isOk1 = false;
        bool isOk2 = false;
        RegistryView registryView = Environment.Is64BitOperatingSystem ? RegistryView.Registry64 : RegistryView.Registry32;
        if (Environment.Is64BitOperatingSystem)
        {
            using (RegistryKey hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, registryView))
            {
                RegistryKey instanceKey = hklm.OpenSubKey(@"SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server\Instance Names\SQL", false);
                if (instanceKey != null)
                {
                    foreach (var instanceName in instanceKey.GetValueNames())
                    {                           
                        isOk2 = true;
                        break;
                    }
                }
            }
        }
        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())
                {
                    isOk1 = true;
                    break;
                }
            }
        }
        return isOk1 || isOk2;
    }

    public static bool CheckInstanceInstalled()
    {
        bool isOk1 = false;
        bool isOk2 = false;
        RegistryView registryView = Environment.Is64BitOperatingSystem ? RegistryView.Registry64 : RegistryView.Registry32;
        if (Environment.Is64BitOperatingSystem)
        {
            using (RegistryKey hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, registryView))
            {
                RegistryKey instanceKey = hklm.OpenSubKey(@"SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server\Instance Names\SQL", false);
                if (instanceKey != null)
                {
                    foreach (string instanceName in instanceKey.GetValueNames())
                    {
                        if (instanceName.ToUpperInvariant() == "DATABASE_NAME")
                        {
                            isOk2 = true;
                            break;
                        }
                    }
                }
            }
        }
        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())
                {
                    if (instanceName.ToUpperInvariant() == "DATABASE_NAME")
                    {
                        isOk1 = true;
                        break;
                    }
                }
            }
        }
        return isOk1 || isOk2;
    }