我需要查找是否在计算机上安装了SQL Server。它可以是任何版本的SQL服务器(7,2005,8,sql express等)。我们在编写安装程序时需要知道这些信息,并且需要向用户显示如果找不到SQL服务器,则无法继续安装。
我见过使用注册表,wmi,SMO或只是连接到SQL服务器实例的版本(虽然这里没有帮助,因为我们不知道服务器名称)。
我们正在使用Wix安装程序。
这样做的正确方法是什么?
JD
答案 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("****************************************");
}
答案 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;
}