我有一个安装程序,用户在连接字符串中输入数据源(即DataSource =“machinename \ instance”)。
给定机器名\实例字符串使用C#,我需要知道服务名称是MSSQLSERVER还是MSSQL $ SQLEXPRESS
在一台特定的计算机上,我们安装了SQL Server 2005(完整版)和SQL Express 2008。
我需要知道这一点的原因是在我们的wix安装程序中,要安装的主应用程序依赖于SQL服务器,因此我们需要具有正确的依赖关系才能安装它。 依赖关系可以在服务MSSQLSERVER或MSSQL $ SQLEXPRESS上,我可以在一台机器上安装这两种服务。
JD
答案 0 :(得分:4)
SQL Server服务被命名为MSSQLSERVER(默认实例)或MSSQL $ INSTANCENAME(命名实例)。你可以从连接字符串中确定它是否是一个命名实例(如果是host\instance
形式的命名实例,如果是host
则是默认实例)但事实是这不是可靠,因为:
因此更可靠的方法是连接并询问实例名称:
SELECT SERVERPROPERTY('InstanceName');
如果返回为NULL,则服务名称为MSSQLSERVER,否则为MSSQL $ ...您甚至可以直接将其放入查询中:
SELECT COALESCE('MSSQL$'+cast(SERVERPROPERTY('InstanceName') as sysname), 'MSSQLSERVER');
答案 1 :(得分:2)
您可以使用ServiceController.GetServices
方法获取当前计算机上所有服务的列表。然后,您可以使用每个属性的ServiceName
属性来确定是否安装了您要查找的每个服务。例如:
ServiceController[] services = ServiceController.GetServices();
if (services.Any(x => x.ServiceName == "MSSQL$SQLEXPRESS"))
{
this.serviceInstaller1.ServicesDependedOn = new string[] { "MSSQL$SQLEXPRESS" };
}
else if (services.Any(x => x.ServiceName == "MSSQLSERVER"))
{
this.serviceInstaller1.ServicesDependedOn = new string[] { "MSSQLSERVER" };
}
答案 2 :(得分:0)
你认为两者都有明显的危害吗?
您可以使用以下方式获取正在运行的服务列表:
using System.ServiceProcess;
// ...
ServiceController[] sc = ServiceController.GetServices();