2010-04-08 5 views
8

Pour tester si je peux me connecter à ma base de données, j'exécuter le code suivant:Test de la connexion SQL sans jeter exception

using (SqlConnection connection = new SqlConnection(myConnectionString)) 
{ 
    try 
    { 
     connection.Open(); 
     canConnect = true; 
    } 
    catch (SqlException) { } 
} 

Cela fonctionne, sauf qu'il lève une exception si la connexion a échoué. Existe-t-il un autre moyen de tester une connexion Sql qui ne génère pas d'exception?

Edit: Pour ajouter une précision, je me demande s'il existe une méthode simple qui fait que, sans avoir à ouvrir la connexion et sur les exceptions qui peuvent se produire

+0

Pourquoi voulez-vous éviter l'exception? – CResults

Répondre

12

Lors de la tentative d'ouverture d'une connexion, il est impossible d'éviter l'exception si la connexion ne peut pas être ouverte. Il peut être caché dans une fonction quelque part, mais vous allez obtenir l'exception, peu importe quoi.

Il a été conçu de cette manière car vous vous attendez généralement à pouvoir vous connecter à la base de données. Une connexion échouée est l'exception . Ceci étant dit, vous pouvez tester l'état de connexion actuel à tout moment en vérifiant la propriété State.

2

écrire une extension comme ceci:

public static class Extension{ 
public static bool CanOpen(this SqlConnection connection){ 
    try{ 
    if(connection == null){ return false; } 

    connection.Open(); 
    var canOpen = connection.State == ConnectionState.Open; 
    connection.close(); 
    return canOpen; 
} 
catch{ 
    return false; 
} 
} 

Ensuite, vous pouvez le consommer comme:

using(var connection = new SqlConnection(myConnectionString)){ 
     if(connection.CanOpen()){ 
     // NOTE: The connection is not open at this point... 
     // You can either open it here or not close it in the extension method... 
     // I prefer opening the connection explicitly here... 
    } 
} 

HTH.

+0

Bonne réponse mais mec, vous lancez une exception – CResults

+0

@CResults: il n'y a pas de thrott dans le bloc catch de la méthode d'extension mangeant effectivement cette exception. Je préfère que cette exception soit levée, mais l'OP a mentionné qu'il ne voulait pas qu'une exception soit lancée en vérifiant si une connexion peut être ouverte, d'où ma solution. – Sunny

+0

Attention à cette solution, _SqlConnection.Open() _ obtiendra la connexion du pool si le pooling est disponible. Alors le _State_ sera _Open_ même si la connexion est corrompue (canal TCP par exemple). Et puis l'exception ne sera levée que lors de l'exécution d'une commande. Une solution de contournement consiste à utiliser _Connection.ChangeDatabase (Connection.Database); _ pour vérifier si la connexion est disponible. – JoeBilly

3

Si une exception est générée et que vous la gérez dans votre bloc catch, vous savez déjà que la connexion a échoué. Je pense que vous avez répondu à votre propre question.

0

Je pense que la vraie réponse ici est ping. À moins que vous vérifiez explicitement

string data = "ismyserverpingable"; 
byte[] buffer = Encoding.ASCII.GetBytes (data); 
int timeout = 120; 
PingReply reply = pingSender.Send ("google.com", timeout, buffer, options); 
if (reply.Status == IPStatus.Success) 
{ 
} 

pour voir si une connexion est possible sql 9/10 vous devez savoir si quelque chose est un serveur SQL. Cela vous épargnerait cette mauvaise utilisation de la mémoire d'une exception qui est ce que je parie que vous êtes vraiment après.

+0

http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.aspx – Arian

0

Vous pouvez toujours utiliser la classe ConnectionStringBuilder et vérifier l'existence de chaque élément requis par une chaîne de connexion avant de tenter de l'ouvrir.

Si la chaîne de connexion est correcte, mais que le serveur de base de données auquel vous vous connectez est en panne, vous obtiendrez toujours un fichier d'exception. Inutile de vérifier la qualité de la chaîne si le point de terminaison auquel vous vous connectez peut être hors ligne.

0

Vous ne pouvez pas éviter les exceptions lors de la connexion à la base de données, mais vous disposez d'une fonction qui gère très bien cette fonction. J'utilise cette fonction qui retourne vrai si la connexion existe.

public static bool IsSQLConnectionAvailable() 
    { 
     SqlConnection _objConn = new SqlConnection(); 

     try 
     { 
      _objConn.ConnectionString = ConfigurationManager.ConnectionStrings["DefaultSQLConnectionString"].ConnectionString; 
      _objConn.Open(); 
     } 
     catch 
     { 
      return false; 
     } 
     finally 
     { 
      if (_objConn.State == ConnectionState.Open) 
       _objConn.Close(); 
     } 

     return true; 
    }