2010-03-05 1 views
4

J'ai un installeur où l'utilisateur entre la source de données dans la chaîne de connexion (c'est-à-dire DataSource = "nom_ordinateur \ instance").De Server Instance comment puis-je déterminer la dépendance de service?

utilisant C# étant donné le machinename \ instance chaîne, je besoin de savoir si le nom du service est MSSQLSERVER ou MSSQL $ SQLEXPRESS

Sur une machine particulière, nous avons SQL Server 2005 (complet) et SQL Express 2008 installé.

La raison pour laquelle je dois le savoir est dans notre installateur wix, l'application principale à installer a une dépendance sur le serveur SQL, nous devons donc avoir la dépendance correcte pour qu'il soit installé. La dépendance peut être sur le service MSSQLSERVER ou MSSQL $ SQLEXPRESS et je peux avoir ces deux services installés sur une machine.

JD

+0

Quel est le problème avec cette réponse alors: http://stackoverflow.com/questions/2381055/check-if-sql-server-any-version-is-installed –

+1

Bonne réponse, mais qui donne moi juste les noms de machines et de ce que je ne peux pas déterminer si la dépendance devrait être sur MSSQLSERVER ou MSSQL $ SQLEXPRESS? –

Répondre

4

services SQL Server sont nommés soit comme MSSqlServer (d'instance par défaut) ou MSSQL $ InstanceName (instances nommées). Vous pouvez déterminer si elle est une instance nommée soit de la chaîne de connexion (si est sous la forme host\instance l'est une instance nommée, si est host est par exemple par défaut alors), mais la vérité est que ce n'est pas fiable, parce que:

  • la chaîne de connexion peut utiliser un alias client SQL
  • la chaîne de connexion peut se connecter à une instance nommée écoute sur le port par défaut
  • la chaîne de connexion peut se connecter à un port explicite et ne précise pas le nom d'instance

Ainsi, d'une manière plus fiable est de se connecter et demander le nom de l'instance:

SELECT SERVERPROPERTY('InstanceName'); 

Si le retour est NULL, le nom du service sera MSSQLSERVER, est par ailleurs MSSQL $ ... Vous pouvez même mettre ce droit dans la requête:

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

@Remus: Merci beaucoup. Ce fut une véritable révélation. Il me vient maintenant à l'esprit que si l'utilisateur choisit un hôte distant, devrais-je créer une dépendance à distance?Si je le faisais (si possible du tout), cela serait-il une mauvaise chose si le serveur devait être transféré à l'avenir vers une autre machine ou s'il s'agit d'un serveur local et ensuite il est mis à niveau (sql 2005 à 2008). Maintenant, ai-je vraiment besoin d'une dépendance sur le serveur SQL, étant donné que notre application est un serveur web personnalisé? Si une page n'est pas affichée, l'utilisateur devra vérifier si le serveur SQL est en cours d'exécution. S'il vous plaît laissez-moi savoir quelles sont vos pensées. –

+0

L'ordre de dépendance de service est important pour que le gestionnaire de contrôle de service puisse suivre l'ordre de démarrage et d'arrêt du service. Entre deux services locaux, il est logique de déclarer cette dépendance. Entre un service local et un service distant, absolument pas. Les applications Web IIS/ASP traditionnelles ne déclarent pas une telle dépendance, principalement en raison de la * volatilité * de ce lien entre web aps et la base de données: l'emplacement du serveur SQL peut se déplacer à la suite d'un simple changement web.config effectué Bloc-notes et laisserait les fausses dépendances déclarées. –

+0

Merci beaucoup. Je vais supprimer la dépendance que nous avons dans ce cas. –

0

Voyez-vous un préjudice important en fonction à la fois?

Vous pouvez obtenir une liste des services en cours d'exécution en utilisant:

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

@Spencer: Oui, l'utilisateur décide ne pas vouloir SQL Server 2005, le service SQL ne sera pas supprimé à moins que les applications dépendantes ne soient supprimées en premier. –

+0

Ah bon point. Je laisserai ma réponse au cas où quelqu'un d'autre aurait la même question/idée. –

2

Vous pouvez utiliser la méthode ServiceController.GetServices pour obtenir une liste de tous les services sur la machine actuelle. Vous pouvez ensuite utiliser la propriété ServiceName de chacun pour déterminer si chaque service que vous recherchez est installé ou non. Par exemple:

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" }; 
} 
+0

@StevanDoggart merci pour le montage effectué – dennis

Questions connexes