Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在使用SQL Server Express的windows服务中定义对SQL Server的依赖关系_C#_.net_Windows Services - Fatal编程技术网

C# 如何在使用SQL Server Express的windows服务中定义对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,另一台

我正在使用以下代码定义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();