2009-06-15 9 views
7

J'utilise le code suivant pour définir une dépendance de service sur SQL Server:Comment puis-je définir une dépendance sur le serveur SQL dans un service Windows qui fonctionne avec SQL Server Express

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

Cela fonctionne dans deux machines , l'un avec SQL Server et l'autre avec SQL Server Express. Mais lorsque j'ai installé le service dans le serveur clients, il a échoué car le nom du service SQL Server Express était différent (SQLSERVEREXPRESS). Existe-t-il un moyen de définir une dépendance qui fonctionne dans les deux situations? Merci.

Répondre

11

Vous devez utiliser le nom de service approprié. Le nom du service SQL est MSSQLSERVER pour les instances par défaut, SQLSERVEREXPRESS pour (certaines) instances Express et MSSQL$<instancename> pour une instance nommée. Puisque le nom est fondamentalement dynamique, la meilleure option est d'énumérer les services SQL Server et de choisir le bon nom, ou d'inviter l'utilisateur si plusieurs choix sont présents.

Malheureusement, je ne connais aucune API pour énumérer les instances SQL Server installées. Même MS support resorts to querying the registry:

Q. Comment puis-je déterminer combien instances de SQL Server sont installés sur un ordinateur?

A: Les noms de tous SQL Server instances sur un ordinateur peut être trouvé de la valeur InstalledInstances qui est situé sous la clé de Registre suivante: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server

0

Voici une élaboration sur ce 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(); 

Je n'ai pas eu l'occasion de tester pleinement les instances non désignés, ou pour tester diff entre x64/x86, etc.

Questions connexes