2011-08-23 2 views
0

J'ai un service Windows qui met à jour les données dans une table de base de données sur un ordinateur distant. Je voulais vérifier si le service fonctionne bien après que le serveur SQL est tombé en panne et redémarre pour une raison quelconque (il peut s'agir d'un redémarrage du logiciel serveur SQL ou du redémarrage brutal de la machine Windows).C# Service Windows Client Sql impossible de se connecter à la base de données après le redémarrage de SQL Server

J'ai installé ce service Windows sur 10 serveurs. Maintenant, quand j'ai redémarré la boîte de serveur de développement sql, tous les programmes de service client fonctionnant dans toutes les 10 boîtes étaient incapables de se reconnecter. Cependant, cela fonctionne correctement après le redémarrage du service client Windows. Je souhaite que les programmes clients se reconnectent automatiquement une fois que le serveur est disponible et évitent de les redémarrer manuellement.

Un conseil s'il vous plaît? Merci d'avance. Voici le code que j'utilise pour établir une connexion au serveur SQL.

private bool ConnectToSqlServer() 
    { 
     try 
     { 
      if (sqlConnection.State == ConnectionState.Closed) 
      { 
       sqlConnection.Open(); 
       return true; 
      } 
      return false; 
     } 
     catch(Exception Ex) 
     { 
      eventLog1.WriteEntry("ConnectToSqlServer " + Ex.Message, EventLogEntryType.Error); 
      return false; 
     } 
    } 

SQL Server 2008 sur Windows 2008 Enterprise R2. Le programme client est C#, développé dans visual studio 2010, qui utilise .net frame work 4.

Répondre

0

Je suppose que vous essayez seulement de vous connecter une fois et que vous obtenez une exception. Si ce n'est pas le cas, cela ne fonctionnera pas ...

Ajoutez un bloc Catch SqlException partout où vous accédez à la base de données de votre client. Ensuite, à partir de ce bloc SqlException, invoquez une logique qui réessaie de se connecter toutes les x secondes pour y itérations. Quelque chose comme ci-dessous:

try 
{ 
    //Database access code here 
} 
catch(SqlException sexc) 
{ 
    if (!ReconnectToDatabase()) 
    { 
     // log error to event log 
    } 
} 

private bool ReconnectToDatabase() 
{ 
    bool isConnected = false; 
    for (int i = 0; i < 5; i++) // 5 is arbitrary, use whatever retry count you want 
    { 
     if (ConnectToSqlServer()) 
     { 
      break; 
     } 
     System.Threading.Thread.Sleep(5000); // 5 seconds is arbitrary 
    } 
} 

Encore une fois, le nombre de nouvelles tentatives et attendre en quelques secondes est arbitraire pour ce poste. Vous devrez prendre en compte le temps d'arrêt de votre client en attente et le temps nécessaire au redémarrage de SQL Server.

Si vous essayez la reconnexion, dans le bloc SqlException, appelez SqlConnection.ClearAllPools().

0

Votre ConnectionPool a des connexions qui sont périmées. Essayez de les effacer en utilisant SqlConnection.ClearAllPools();

Questions connexes