从Server \ Instance如何确定服务依赖性?

时间:2010-03-05 16:42:09

标签: c# sql-server

我有一个安装程序,用户在连接字符串中输入数据源(即DataSource =“machinename \ instance”)。

给定机器名\实例字符串使用C#,我需要知道服务名称是MSSQLSERVER还是MSSQL $ SQLEXPRESS

在一台特定的计算机上,我们安装了SQL Server 2005(完整版)和SQL Express 2008。

我需要知道这一点的原因是在我们的wix安装程序中,要安装的主应用程序依赖于SQL服务器,因此我们需要具有正确的依赖关系才能安装它。 依赖关系可以在服务MSSQLSERVER或MSSQL $ SQLEXPRESS上,我可以在一台机器上安装这两种服务。

JD

3 个答案:

答案 0 :(得分:4)

SQL Server服务被命名为MSSQLSERVER(默认实例)或MSSQL $ INSTANCENAME(命名实例)。你可以从连接字符串中确定它是否是一个命名实例(如果是host\instance形式的命名实例,如果是host则是默认实例)但事实是这不是可靠,因为:

  • 连接字符串可以使用SQL客户端别名
  • 连接字符串可以连接到侦听默认端口
  • 的命名实例
  • 连接字符串可以连接到显式端口,而不指定实例名称

因此更可靠的方法是连接并询问实例名称:

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();