2009-06-15 11 views
7

estoy usando el código siguiente para definir una dependencia de servicio en SQL Server:¿Cómo puedo definir una dependencia de SQL Server en un servicio de Windows que funciona con SQL Server Express

serviceInstaller.StartType = ServiceStartMode.Automatic; 
serviceInstaller.ServicesDependedOn = new[] { "MSSQLSERVER" }; 
Installers.Add(serviceInstaller); 
Installers.Add(processInstaller); 

Esto funciona de dos máquinas , uno con SQL Server y el otro con SQL Server Express. Pero cuando instalé el servicio en el servidor de clientes, falló porque el nombre del servicio SQL Server Express era diferente (SQLSERVEREXPRESS). ¿Hay alguna forma de definir una dependencia que funcione en ambas situaciones? Gracias.

Respuesta

11

Debe utilizar el nombre del servicio adecuado. El nombre del servicio SQL es MSSQLSERVER para instancias predeterminadas, SQLSERVEREXPRESS para (algunas) instancias Express y MSSQL$<instancename> para una instancia con nombre. Dado que el nombre es básicamente dinámico, la mejor opción es enumerar los servicios de SQL Server y elegir el nombre correcto, o solicitar al usuario si hay múltiples opciones presentes.

Desafortunadamente, no conozco ninguna API para enumerar las instancias de SQL Server instaladas. Incluso MS support resorts to querying the registry:

P. ¿Cómo se determina el número de instancias de SQL Server se instala en un ordenador ?

A: Los nombres de todos SQL Server instancias en un ordenador se pueden encontrar del valor InstalledInstances que se encuentra en la siguiente clave registro: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server

0

Aquí es una elaboración de lo Remus Rusanu proposed:

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

no tuve la oportunidad de probar completamente casos sin nombre, o para probar diff erences entre x64/x86, etc.

Cuestiones relacionadas