C# 从服务器\实例如何确定服务依赖关系?

C# 从服务器\实例如何确定服务依赖关系?,c#,sql-server,C#,Sql Server,我有一个安装程序,用户在其中输入连接字符串中的数据源(即DataSource=“machinename\instance”) 使用C#给定machinename\instance字符串,我需要知道服务名称是MSSQLSERVER还是MSSQL$SQLEXPRESS 在一台特定的机器上,我们安装了SQL Server 2005(完整版)和SQL Express 2008 我需要知道这一点的原因是在我们的wix安装程序中,要安装的主应用程序依赖于SQL server,因此我们需要有正确的依赖关系才能

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

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

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

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


JD

你认为依赖两者会有很大的危害吗

您可以使用以下方法获取正在运行的服务的列表:

using System.ServiceProcess;
// ...
ServiceController[] sc = ServiceController.GetServices();

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

  • 连接字符串可能使用SQL客户端别名
  • 连接字符串可以连接到默认端口上侦听的命名实例
  • 连接字符串可以连接到显式端口,而不指定实例名称
因此,更可靠的方法是连接并请求实例名称:

SELECT SERVERPROPERTY('InstanceName');
如果返回值为NULL,则服务名称为MSSQLSERVER,否则为MSSQL$。。。您甚至可以将其直接放入查询中:

SELECT COALESCE('MSSQL$'+cast(SERVERPROPERTY('InstanceName') as sysname), 'MSSQLSERVER');

您可以使用
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" }; 
} 

那么,这个答案有什么问题:答案很好,但这只给出了机器名,因此我无法确定依赖关系是在MSSQLSERVER还是MSSQL$SQLEXPRESS上?@Spencer:是的,如果用户决定不使用sql server 2005,那么sql服务将不会被删除,除非先删除依赖的应用程序。啊,好的观点。我会留下我的答案,以防万一其他人也有同样的问题/想法。@Remus:非常感谢。那真是让人大开眼界。现在我明白了,如果用户选择远程主机,我是否必须创建远程依赖关系?如果我这样做了(如果可能的话),如果服务器将来被换到另一台机器上,或者如果它是本地服务器,然后升级(sql 2005到2008),这会是一件坏事吗。现在,考虑到我们的应用程序是一个自定义web服务器,我真的需要依赖SQL server吗?如果未显示页面,则用户必须检查SQL server是否仍在运行。请告诉我您的想法。服务依赖顺序对于服务控制管理器跟踪服务启动和关闭顺序非常重要。在两个本地服务之间,声明此依赖关系是有意义的。在本地和远程服务之间,绝对不是。传统的IIS/ASP web应用程序不声明这种依赖关系,这主要是因为web AP和数据库之间的链接具有易变性:在记事本中进行简单的web.config更改后,SQL server的位置可能会移动,并且会声明假依赖关系。非常感谢。在本例中,我将删除依赖项。