2009-07-21 7 views
1

J'ai une application winform qui doit être mise au courant lorsqu'un serveur SQL est disponible afin de permettre la fonctionnalité de synchronisation de fusion. J'ai essayé des variantes de ce qui suit, qui fonctionnent une fois, mais je voudrais proposer quelque chose d'un peu plus dynamique.Surveillance en temps réel de l'état du réseau. Quels événements sont soulevés?

La fonction ci-dessous (Merci Alex_L) vérifie le port 1433 sur lequel SQL s'exécute et fonctionne très bien. Ce que j'essaie d'accomplir est un moyen de surveiller cela en temps réel. Devrais-je créer un service Windows? Qu'en est-il des autres événements réseau comme la connexion réseau?

L'utilisation de cette application parfois connectée est simple. Si elles sont sur notre réseau, la partie Fusionner la réplication est disponible. S'ils ne sont pas sur notre réseau, ce n'est pas le cas. SQL Server ne devrait jamais être disponible sur notre réseau et il DEVRAIT toujours être disponible lorsqu'il est activé. Cela étant dit, je serais ouvert aux solutions qui impliquent la détection de notre réseau actuel au lieu de l'instance SQL.

 private static bool IsSqlAvailable() 
     { 
      TcpClient tcpc = new TcpClient(); 
      try 
       { 
       tcpc.Connect("10.250.50.30", 1433); 
       return true; 
       } 
      catch 
       { 
       return false; 
       } 
     } 

Répondre

2

Vous pouvez vérifier le port 1433 de SQL Server (ou une autre, le cas échéant):

TcpClient tcpc = new TcpClient(); 
try 
{ 
    tcpc.Connect("10.250.50.30", 1433); 
    return true; 
} 
catch 
{ 
    return false; 
} 
+0

Merci, je ne le savais pas. Il n'y a aucun moyen cependant de surveiller cela en temps réel? Je devrais vérifier cela périodiquement, manuellement, afin d '«imiter» le temps réel? –

+0

Comme je le pense, la façon la plus simple (et comme je le fais dans mes projets) est d'écrire le service Windows. Ce petit service vérifie la disponibilité des serveurs SQL (en utilisant la classe Timer) et envoie les messages aux administrateurs appropriés. –

1

J'irais probablement avec la 2ème méthode, en ajoutant dans les contrôles les différentes propriétés de base de données pour s'assurer qu'il est sûr d'écrire.

http://msdn.microsoft.com/en-us/library/ms176049.aspx

plan Ok B en réponse au commentaire ci-dessous: Demandez à votre serveur SQL envoyer une sorte de « Heartbeat » à votre application principale (Ping ou tout, à vous). Vous pouvez faire en sorte que votre application exécute un thread distinct pour surveiller ce battement toutes les X secondes. Si vous arrêtez de recevoir ce signal, vous n'êtes pas connecté à votre serveur pour exécuter la fusion.

+0

Comment l'utiliser pour implémenter la vérification dynamique? C'est ce que j'essaie de poser dans ma question (peut-être mal). Je veux que le programme sache quand une connexion est disponible ou non en cours d'exécution non seulement au démarrage. –

+0

Merci pour les réponses. Est-ce une option viable avec 200 utilisateurs déconnectés? Avoir notre serveur de production pinging 200 utilisateurs constamment? De plus, nous utilisons le DNS Dynamique pour que les IP changent tout le temps bien que je suppose que vous pouvez faire un ping par HOSTNAME. Je ne peux pas croire qu'il n'y a pas un moyen pour un système local de surveiller une connexion? Même si c'est juste pour voir s'ils sont actuellement sur notre réseau. Il doit y avoir un événement soulevé lorsque l'état de connexion change, j'aurais pensé. –

+0

Autant que je sache, la seule chose que les contrôles internes à voir si une connexion est bonne est de l'envoyer par un ping et de vérifier ce qui se passe. Après cela, tous les événements peuvent être soulevés. Aussi, je ne dis pas que votre serveur de production devrait faire 200 pings individuels à chaque machine client. Je pense que votre serveur devrait faire une seule diffusion sur un port arbitraire (54321 par exemple). Concevez votre thread de travail pour vous connecter à votre serveur sur le port 54321. Ensuite, chaque client connecté le verra en une seule fois. –

2

J'ai une entrée sur mon blog montrant how to detect network availability changes. Il utilise l'API Windows NotifyAddrChange pour déclencher un événement géré chaque fois qu'il y a un changement dans la table de mappage d'adresse d'interface IP. Puisque de tels changements sont associés aux changements de disponibilité du réseau (connexion par câble, connexion WiFi, connexion VPN, accès commuté, accès commuté 3G, etc.), vous pouvez utiliser l'événement pour tester la disponibilité du serveur et démarrer votre synchronisation.

Questions connexes