Überprüfen Sie, ob die SQL-Verbindung offen oder geschlossen ist


102

Wie überprüfen Sie, ob es offen oder geschlossen ist, das ich verwendet habe?

 if (SQLOperator.SQLCONNECTION.State.Equals("Open"))

Selbst wenn der Status "Offen" ist, schlägt dies bei dieser Prüfung fehl.

Antworten:


175

Sie sollten SqlConnection.State verwenden

z.B,

using System.Data;

if (myConnection != null && myConnection.State == ConnectionState.Closed)
{
   // do something
   // ...
}

2
+1 genau - benutze die SqlConnectionStateAufzählung als Aufzählung und
verwandle

4
Hätte using System.Data;in der Antwort hinzufügen sollen , IMHO. Ich habe diesen Namespace vergessen (hatte using System.Data.SqlClient) und konnte nicht herausfinden, wie ich ConnectionStateals Schlüsselwort komme, bis ich ihn hinzugefügt habe. Hoffe das hilft jemandem.
Vapcguy

Funktioniert dies, wenn der Server (oder etwas zwischen dem lokalen Computer und dem Server) die Verbindung geschlossen hat?
jpmc26

Wäre es nicht besser zu sagen if (myConnection == null || myConnection.State == ConnectionState.Closed) { //Connection is closed } else { //Connection is open in some way }? Auf diese Weise wird die Verbindung, wenn sie null ist, auch "geschlossen".
Arvo Bowen

52

Folgendes verwende ich:

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

Der Grund, warum ich nicht einfach benutze:

if (mySQLConnection.State == ConnectionState.Closed)
{
    mySQLConnection.Open();
}

Liegt daran, dass der ConnectionState auch sein kann:

Broken, Connnecting, Executing, Fetching

Zusätzlich zu

Open, Closed

Darüber hinaus gibt Microsoft an, dass durch Schließen und erneutes Öffnen der Verbindung "der Wert von State aktualisiert wird". Siehe hier http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.state(v=vs.110).aspx


Sie sollten testen, ob mySQLConnection.State != ConnectionState.Open && mySQLConnection.State != ConnectionState.Connecting das Zurücksetzen bei langsamen Verbindungen vermeiden sollten, oder?
Caligari

@caligari Obwohl true, gibt es keine Garantie für DbConnection. Wenn Sie also auf die abstrakte DbConnection programmieren, seien Sie vorsichtig.
John Zabroski

1
Ich persönlich denke, dies ist die Art von Problem, die Sie lösen, indem Sie es vermeiden. Ich kann den Anwendungsfall für dieses Code-Snippet möglicherweise in einer zustandsbehafteten Anwendungsschicht sehen, aber niemals im Web.
John Zabroski

John, das ist genau der Anwendungsfall für diesen Code. Code, der eine Serveranwendung ausführt, die möglicherweise Seiten bereitstellt und eine Verbindung zu einem anderen REST-Server herstellt. Ich sehe keinen Fall, in dem ich im clientseitigen Code einer Webanwendung eine Verbindung zu einer Serverdatenbank herstellen würde.
Therealjumbo

Dies hat eine große Einschränkung: 1) Da lokaler Speicher jetzt zu einer Sache wird, werden Web-Apps, die lokalen Speicher verwenden, früher oder später (bereits?) Eine Datenbank in diesem Speicher verwenden. Wenn nicht jetzt, werden sie in Kürze. Die andere Sache hier ist, dass mein Code wahrscheinlich nicht richtig verallgemeinert ist, um in einer großen Anwendung verwendet zu werden. Mein Hauptaugenmerk liegt auf der eingebetteten Programmierung, daher lerne ich immer noch auf der Serverseite.
Therealjumbo

24

In der .NET-Dokumentation heißt es: State Property: Eine bitweise Kombination der ConnectionState-Werte

Also ich denke du solltest es überprüfen

!myConnection.State.HasFlag(ConnectionState.Open)

anstatt

myConnection.State != ConnectionState.Open

weil State mehrere Flags haben kann.


Ich frage mich, warum dies eine Aufzählung mit Flaggen ist. Da der Wert des Elements Schließen dieser Aufzählung Null ist, gibt State.HasFlag (ConnectionState.Close) für jeden Wert true zurück. Für mich bedeutet das, dass ich als "! = Schließen"
Ivan


4
HINWEIS: Ich halte es für notwendig zu erwähnen, dass in Iwans Link erwähnt wird, dass Sie dies NICHT als Flags verwenden sollten. Siehe diese spezifische Antwort: stackoverflow.com/a/35484965/2499090
Brent Rittenhouse

9

Überprüfen Sie, ob eine MySQL-Verbindung geöffnet ist

ConnectionState state = connection.State;
if (state == ConnectionState.Open)
{
    return true;
}
else
{
    connection.Open();
    return true;
}

Was ist der Zweck der Rückkehr immer wahr? Machen Sie an dieser Stelle die Methode ungültig. Überprüfen Sie nur, ob die Verbindung nicht geöffnet ist, und öffnen Sie sie gegebenenfalls. Und ... warum 2 mal schreiben return true;? Setzen Sie es am Ende der Methode außerhalb des if/ else!
Massimiliano Kraus

Bei Netzwerkproblemen würden diese eine falsche Antwort geben. Sie können nicht sicher sein, dass sich open tatsächlich öffnet.
user613326

@ user613326 eigentlich würde es nicht. Der Beispielcode enthält keine Fehlerbehandlung. Bei Problemen beim Herstellen der Verbindung wird die Ausnahme einfach behoben. Der zurückgegebene Wert ist daher korrekt.
Tom Lint

6

Sie können dies auch verwenden

if (SQLCON.State == ConnectionState.Closed)
{
     SQLCON.Open();
}

1
using System.Data;für alle, die nicht wussten oder nicht wussten, warum es nicht funktionierte
Coops

5

Dieser Code ist etwas defensiver, bevor Sie eine Verbindung öffnen, überprüfen Sie den Status. Wenn der Verbindungsstatus unterbrochen ist, sollten wir versuchen, ihn zu schließen. Unterbrochen bedeutet, dass die Verbindung zuvor geöffnet wurde und nicht richtig funktioniert. Die zweite Bedingung bestimmt, dass der Verbindungsstatus geschlossen werden muss, bevor versucht wird, ihn erneut zu öffnen, damit der Code wiederholt aufgerufen werden kann.

// Defensive database opening logic.

if (_databaseConnection.State == ConnectionState.Broken) {
    _databaseConnection.Close();
}

if (_databaseConnection.State == ConnectionState.Closed) {
    _databaseConnection.Open();
}

Nur ein bisschen defensiver sein.
GBGOLC

1
Aus der Überprüfungswarteschlange: Darf ich Sie bitten, Ihrer Antwort einen weiteren Kontext hinzuzufügen. Nur-Code-Antworten sind schwer zu verstehen. Es wird sowohl dem Fragesteller als auch zukünftigen Lesern helfen, wenn Sie Ihrem Beitrag weitere Informationen hinzufügen können. Siehe auch Erklären vollständig codebasierter Antworten .
help-info.de

3

Um den Datenbankverbindungsstatus zu überprüfen, gehen Sie einfach wie folgt vor

if(con.State == ConnectionState.Open){}

2

Verwenden Sie Folgendes, um den OleDbConnection-Status zu überprüfen:

if (oconn.State == ConnectionState.Open)
{
    oconn.Close();
}

State Gib die ... wieder ConnectionState

public override ConnectionState State { get; }

Hier sind die anderen ConnectionStateAufzählungen

public enum ConnectionState
    {
        //
        // Summary:
        //     The connection is closed.
        Closed = 0,
        //
        // Summary:
        //     The connection is open.
        Open = 1,
        //
        // Summary:
        //     The connection object is connecting to the data source. (This value is reserved
        //     for future versions of the product.)
        Connecting = 2,
        //
        // Summary:
        //     The connection object is executing a command. (This value is reserved for future
        //     versions of the product.)
        Executing = 4,
        //
        // Summary:
        //     The connection object is retrieving data. (This value is reserved for future
        //     versions of the product.)
        Fetching = 8,
        //
        // Summary:
        //     The connection to the data source is broken. This can occur only after the connection
        //     has been opened. A connection in this state may be closed and then re-opened.
        //     (This value is reserved for future versions of the product.)
        Broken = 16
    }

-5

Ich benutze die folgende Art und Weise sqlconnection.state

if(conexion.state != connectionState.open())
   conexion.open();

7
connectionState.open()existiert nicht; meinst du ConnectionState.Open?
Peter Ritchie
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.