2008-09-19 8 views
5

Wenn Sie eine SqlConnection vor dem Ausgeben von Abfragen öffnen müssen, können Sie einfach alle nicht geöffneten ConnectionStates auf die gleiche Weise behandeln? Zum Beispiel:Umgang mit verschiedenen ConnectionStates vor dem Öffnen von SqlConnection

if (connection.State != ConnectionState.Open) 
    { 
     connection.Open(); 
    } 

Ich habe irgendwo gelesen, dass für ConnectionState.Broken die Verbindung geschlossen werden muss, bevor seine Wiedereröffnung. Hat jemand Erfahrung damit? Danke

Antwort

5

http://msdn.microsoft.com/en-us/library/system.data.connectionstate.aspx

Gebrochene Verbindungszustand braucht für die weitere Verwendung vor qualifizierten geschlossen und wieder geöffnet werden.

Edit: Leider wird das Schließen einer geschlossenen Verbindung ebenfalls verhindert. Sie müssen ConnectionState testen, bevor Sie auf eine unbekannte Verbindung reagieren. Vielleicht könnte eine kurze Switch-Anweisung genügen.

4

Dies beantwortet nicht direkt Ihre Frage, aber die beste Vorgehensweise ist das Öffnen und Schließen einer Verbindung für jeden Zugriff auf die Datenbank. ADO.NET Connection Pooling stellt sicher, dass dies gut funktioniert. Es ist besonders wichtig, dies in Server-Apps (z. B. ASP.NET) zu tun, aber ich würde es sogar in einer WinForms-App tun, die direkt auf die Datenbank zugreift.

Beispiel:

using(SqlConnection connection = new SqlConnection(...)) 
{ 
    connection.Open(); 
    // ... do your stuff here 

} // Connection is disposed and closed here, even if an exception is thrown 

Auf diese Weise müssen Sie nie den Verbindungszustand zu überprüfen, wenn eine Verbindung zu öffnen.

+0

Sie sollten nicht für die GC warten zu schließen und eine Verbindung zu entsorgen. Sie sollten eine Verbindung explizit schließen, sobald Sie damit fertig sind. – ddc0660

+0

Die using-Anweisung stellt sicher, dass die Verbindung geschlossen ist, selbst wenn eine Ausnahme ausgelöst wird. Es wartet nicht darauf, dass der GC es schließt. – Joe

+1

Dieses Using-Muster ist, wie alle Datenzugriff aussehen sollte. Sie werden niemals Verbindungen auf diese Weise verlieren. Joe, ich würde auch "using (SqlCommand command ..." innerhalb der Verwendung von SqlConnection hinzufügen und eine Konstante für die Abfragezeichenfolge empfehlen, um sicherzustellen, dass sie immer aus demselben Pool kommt. –

3

Sie können es auf die gleiche Weise behandeln. Ich habe zahlreiche Verbindungsstatus == gebrochen, während IE9 verwendet. In dieser Hinsicht ist etwas grundlegend falsch mit IE9, da kein anderer Browser dieses Problem der unterbrochenen Verbindungszustände nach 5 oder 6 Aktualisierungen der Datenbanktabellen hatte. Also verwende ich Objektkontext. Also schließen Sie es einfach und öffnen Sie es wieder.

Ich habe diesen Code, bevor alle meine liest und Updates in der businss-Logik-Schicht:

if (context.Connection.State == System.Data.ConnectionState.Broken) 
{ 
    context.Connection.Close(); 
    context.Connection.Open(); 
} 
Verwandte Themen