C# 如何在使用SQL Server Express的windows服务中定义对SQL Server的依赖关系
我正在使用以下代码定义SQL Server上的服务依赖项:C# 如何在使用SQL Server Express的windows服务中定义对SQL Server的依赖关系,c#,.net,windows-services,C#,.net,Windows Services,我正在使用以下代码定义SQL Server上的服务依赖项: serviceInstaller.StartType = ServiceStartMode.Automatic; serviceInstaller.ServicesDependedOn = new[] { "MSSQLSERVER" }; Installers.Add(serviceInstaller); Installers.Add(processInstaller); 这可以在两台机器上工作,一台使用SQL Server,另一台
serviceInstaller.StartType = ServiceStartMode.Automatic;
serviceInstaller.ServicesDependedOn = new[] { "MSSQLSERVER" };
Installers.Add(serviceInstaller);
Installers.Add(processInstaller);
这可以在两台机器上工作,一台使用SQL Server,另一台使用SQL Server Express。但是,当我在客户机服务器中安装该服务时,它失败了,因为SQLSERVEREXPRESS服务名称不同(SQLSERVEREXPRESS)。
有没有办法定义在这两种情况下都有效的依赖关系?
谢谢 您需要使用正确的服务名称。对于默认实例,SQL服务名称为MSSQLSERVER;对于(某些)Express实例,SQL服务名称为SQLSERVEREXPRESS;对于命名实例,SQL服务名称为
MSSQL$
。由于名称基本上是动态的,因此最好的选择是枚举SQL Server服务并选择正确的名称,或者在存在多个选项时提示用户
不幸的是,我不知道有任何API可以枚举已安装的SQL Server实例。甚至:
问:我如何确定有多少
已安装SQL Server的实例
在电脑上
答:所有SQL Server的名称
可以找到计算机上的实例
从InstalledInstances值
位于下面的
注册表项:
HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server
以下是关于以下内容的详细说明:
//来源:https://stackoverflow.com/a/7139986/16911
//获取所有已安装的命名实例。
var localMachine=RegistryKey.OpenBaseKey(RegistryHive.localMachine,RegistryView.Registry64);
var rk=localMachine.OpenSubKey(“软件\\Microsoft\\Microsoft SQL Server”);
var实例=(字符串[])rk.GetValue(“InstalledInstances”);
列出sqlServices=instances.Select(x=>“MSSQL$”+x).ToList();
//添加SQLSERVEREXPRESS和MSSQLSERVER(如果存在)。
如果(DoeServiceExist(“SQLSERVEREXPRESS”)){
添加(“SQLSERVEREXPRESS”);
}
如果(DoeServiceExist(“MSSQLSERVER”)){
添加(“MSSQLSERVER”);
}
service.ServicesDependedOn=sqlServices.ToArray();
我没有机会完全测试非命名实例,或者测试x64/x86之间的差异,等等
//Source: https://stackoverflow.com/a/7139986/16911
//Get all installed named instances.
var localMachine = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
var rk = localMachine.OpenSubKey("SOFTWARE\\Microsoft\\Microsoft SQL Server");
var instances = (String[])rk.GetValue("InstalledInstances");
List<String> sqlServices = instances.Select(x => "MSSQL$" + x).ToList();
//Add SQLSERVEREXPRESS and MSSQLSERVER, if they exist.
if(DoesServiceExist("SQLSERVEREXPRESS")) {
sqlServices.Add("SQLSERVEREXPRESS");
}
if(DoesServiceExist("MSSQLSERVER")) {
sqlServices.Add("MSSQLSERVER");
}
service.ServicesDependedOn = sqlServices.ToArray();