2010-04-08 13 views
8

Um zu testen, ob ich zu meiner Datenbank verbinden kann, führe ich den folgenden Code:Test-SQL-Verbindung ohne Ausnahme zu werfen

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

Dies funktioniert, außer es eine Ausnahme, wenn die Verbindung nicht löst. Gibt es eine andere Möglichkeit, eine SQL-Verbindung zu testen, die keine Ausnahme auslöst?

Edit: Präzision hinzuzufügen, ich bin zu fragen, ob es eine einfache Methode, die, ohne die Verbindung zu öffnen und Ausnahmen fangen tut, dass diese

+0

Warum möchten Sie die Ausnahme vermeiden? – CResults

Antwort

12

Beim Versuch, eine Verbindung zu öffnen, gibt es keine Möglichkeit, die Ausnahme zu vermeiden, wenn die Verbindung nicht geöffnet werden kann. Es kann irgendwo in einer Funktion versteckt werden, aber Sie werden die Ausnahme bekommen, egal was passiert.

Es wurde so entworfen, weil Sie im Allgemeinen eine Verbindung zur Datenbank erwarten. Eine fehlgeschlagene Verbindung ist die Ausnahme.

Dies gesagt, können Sie den aktuellen Verbindungsstatus jederzeit überprüfen, indem Sie die State Eigenschaft überprüfen.

2

eine Erweiterung wie so schreiben können auftreten:

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; 
} 
} 

Dann können Sie verbrauchen es mögen:

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

Schöne Antwort, aber Kumpel, Sie werfen eine Ausnahme – CResults

+0

@CResults: Es gibt keine THROW im Catch-Block der Extension-Methode effektiv diese Ausnahme zu essen. Ich bevorzuge es, diese Ausnahme ausgelöst zu bekommen, aber der OP erwähnte, dass er keinen Ausnahme-Throw haben wollte, wenn er überprüft, ob eine Verbindung geöffnet werden kann, daher meine Lösung. – Sunny

+0

Kümmern Sie sich um diese Lösung, _SqlConnection.Open() _ erhält die Verbindung vom Pool, wenn Pooling verfügbar ist. Dann wird _State_ _Open_ sein, auch wenn die Verbindung beschädigt ist (zum Beispiel TCP-Kanal unten). Und dann wird die Ausnahme nur beim Ausführen eines Befehls ausgelöst. Eine Problemumgehung besteht darin, _Connection.ChangeDatabase (Connection.Database); _ zu verwenden, um zu überprüfen, ob die Verbindung verfügbar ist. – JoeBilly

3

Wenn es eine Ausnahme auslöst und Sie in Ihrem catch-Block damit umgehen, wissen Sie bereits, dass die Verbindung fehlgeschlagen ist. Ich denke, du hast deine eigene Frage beantwortet.

0

Ich denke, die wirkliche Antwort hier ist Ping.

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) 
{ 
} 

Sofern Sie nicht explizit zu sehen sind, zu überprüfen, ob eine SQL-Verbindung möglich ist 9/10 Sie sollten wissen, wenn etwas ein SQL-Server ist. Dies würde dir die unangenehme Speicherauslastung einer Ausnahme ersparen, auf die ich wette, dass du wirklich danach bist.

+0

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

0

Sie können immer die Klasse ConnectionStringBuilder verwenden und nach dem Vorhandensein jedes Stücks suchen, das für eine Verbindungszeichenfolge erforderlich ist, bevor Sie versuchen, es zu öffnen.

Wenn die Verbindungszeichenfolge korrekt ist, aber der Datenbankserver, mit dem Sie eine Verbindung herstellen, inaktiv ist, erhalten Sie trotzdem eine Ausnahme. Es ist sinnlos, die Qualität der Zeichenfolge zu überprüfen, wenn der Endpunkt, zu dem Sie eine Verbindung herstellen, möglicherweise offline ist.

0

Sie können nicht vermeiden, dass beim Verbinden der Datenbank eine Ausnahme auftritt, aber haben Sie eine Funktion, die das sehr gut behandelt. Ich verwende diese Funktion, die wahr zurückgibt, wenn Verbindung besteht.

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; 
    }