Подтвердить что ты не робот

Проверьте, установлен ли сервер SQL (любая версия)?

Мне нужно найти, установлен ли сервер SQL на машине. Это может быть любая версия SQL-сервера (7, 2005,8, sql express и т.д.). Нам нужно знать эту информацию, поскольку мы пишем установщик и должны показать пользователю, что если SQL-сервер не найден, установка не может продолжаться.

Я видел версии, которые используют реестр, wmi, SMO или просто подключаются к экземпляру SQL-сервера (хотя здесь это не помогло, так как мы не знаем имя сервера).

Мы используем установщик Wix.

Каков правильный способ сделать это?

JD

4b9b3361

Ответ 1

Простой способ перечислить все серверы SQL в сети:

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("****************************************");
}

Взято из это сообщение в блоге.

Ответ 2

Другой простой альтернативой может быть использование следующей командной строки внутри вашего установщика:

sc queryex type= service | find "MSSQL"

В приведенной выше команде просто перечислены все службы, содержащие часть MSSQL, перечисляющие имена и экземпляры SQL Server по умолчанию. Эта команда ничего не возвращает, если ничего не найдено. Он возвращает что-то вроде этого:

SERVICE_NAME: MSSQL$SQLEXPRESS

Надеюсь, что это поможет.

Ответ 3

Посмотрите на этот вопрос: Как определить установленные экземпляры SQL Server и их версии?

В одном из ответов перечислены ключи реестра, которые вы можете проверить, чтобы определить установленные версии SQL Server.

Или проверьте эту статью кодекса, если вам нужно найти SQL-серверы в локальной сети: http://www.codeproject.com/KB/database/locate_sql_servers.aspx

Ответ 4

Мне нужно что-то подобное, чтобы обнаружить локальный экземпляр 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;
}

Ответ 5

Еще один полезный, но поздний (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;
    }