Проверьте, установлен ли сервер SQL (любая версия)?
Мне нужно найти, установлен ли сервер SQL на машине. Это может быть любая версия SQL-сервера (7, 2005,8, sql express и т.д.). Нам нужно знать эту информацию, поскольку мы пишем установщик и должны показать пользователю, что если SQL-сервер не найден, установка не может продолжаться.
Я видел версии, которые используют реестр, wmi, SMO или просто подключаются к экземпляру SQL-сервера (хотя здесь это не помогло, так как мы не знаем имя сервера).
Мы используем установщик Wix.
Каков правильный способ сделать это?
JD
Ответы
Ответ 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;
}