Controlla se la connessione SQL è aperta o chiusa


102

Come si controlla se è aperto o chiuso che stavo usando

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

tuttavia, anche se lo Stato è "Aperto", questo controllo fallisce.

Risposte:


175

Dovresti usare SqlConnection.State

per esempio,

using System.Data;

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

2
+1 esattamente - usa l' SqlConnectionStateenum come enum e non trasformarlo in una stringa .....
marc_s

4
Avrei dovuto aggiungere using System.Data;nella risposta, IMHO. Ho dimenticato questo spazio dei nomi (aveva using System.Data.SqlClient) e non riuscivo a capire come ottenere ConnectionStatecome parola chiave finché non l'ho aggiunto. Spero che questo aiuti qualcuno.
vapcguy

Funziona se il server (o qualcosa tra la macchina locale e il server) ha chiuso la connessione?
jpmc26

Non sarebbe meglio dire if (myConnection == null || myConnection.State == ConnectionState.Closed) { //Connection is closed } else { //Connection is open in some way }? In questo modo se la connessione è nulla viene anche "chiusa".
Arvo Bowen

52

Ecco cosa sto usando:

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

Il motivo per cui non sto semplicemente usando:

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

È perché ConnectionState può anche essere:

Broken, Connnecting, Executing, Fetching

Inoltre

Open, Closed

Inoltre, Microsoft afferma che la chiusura e quindi la riapertura della connessione "aggiornerà il valore dello stato". Vedi qui http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.state(v=vs.110).aspx


Dovresti verificare se mySQLConnection.State != ConnectionState.Open && mySQLConnection.State != ConnectionState.Connectingper evitare ripristini con connessioni lente, non è vero?
caligari

@caligari Sebbene sia vero, non esiste alcuna garanzia per DbConnection, quindi se si programma sull'astratto DbConnection, fare attenzione.
John Zabroski

1
Personalmente penso che questo sia il tipo di problema che risolvi evitando. Posso forse vedere il caso d'uso di questo frammento di codice in un livello di applicazione stateful, ma mai sul Web?
John Zabroski

John, questo è esattamente il caso d'uso di questo codice. Codice che esegue un'applicazione server che potrebbe servire pagine, connettendosi a un altro server REST qualunque. Non vedo alcun caso in cui mi collegherei a un database del server nel codice lato client in un'applicazione web.
therealjumbo

C'è un gigantesco avvertimento in questo: 1) con l'archiviazione locale che sta diventando una cosa, prima o poi (già?) Le app Web che utilizzano l'archiviazione locale useranno un database in quella memoria. Se non ora, lo faranno a breve. L'altra cosa qui è che il mio codice probabilmente non è adeguatamente generalizzato per essere utilizzato in un'applicazione di grandi dimensioni. Il mio obiettivo principale è la programmazione integrata, quindi sto ancora imparando sul lato server.
therealjumbo

24

La documentazione .NET dice: Proprietà State: una combinazione bit per bit dei valori ConnectionState

Quindi penso che dovresti controllare

!myConnection.State.HasFlag(ConnectionState.Open)

invece di

myConnection.State != ConnectionState.Open

perché lo stato può avere più flag.


Mi chiedo perché sia ​​enumerazione con flag. Poiché il valore dell'elemento Close di questa enumerazione è zero, State.HasFlag (ConnectionState.Close) restituirà true per qualsiasi valore. Per me significa che dovrei controllare come "! = Chiudi"
Ivan


4
NOTA: sento che è necessario menzionare che il link di Ivan menziona che NON DOVRESTI usarlo come flag. Vedi questa risposta specifica: stackoverflow.com/a/35484965/2499090
Brent Rittenhouse

9

Controlla se è aperta una connessione MySQL

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

Qual è lo scopo di restituire sempre vero? A questo punto, annulla il metodo. Solo, controlla se la connessione non è aperta e in tal caso aprila. E ... perché scrivere 2 volte return true;? mettilo alla fine del metodo, fuori da if/ else!
Massimiliano Kraus

In caso di problemi di rete questi darebbero una risposta sbagliata. non puoi essere sicuro che open si aprirà davvero.
user613326

@ user613326 in realtà non lo sarebbe. Non vi è alcuna gestione degli errori nel codice di esempio, quindi qualsiasi problema durante la connessione genererà semplicemente e lascerà a voi la gestione dell'eccezione. Il valore restituito è quindi corretto.
Tom Lint

6

puoi anche usare questo

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

1
using System.Data;per chiunque non lo sapesse o non sapesse perché non funzionava
Coops

5

Questo codice è un po 'più difensivo, prima di aprire una connessione, controlla lo stato. Se lo stato della connessione è interrotto, dovremmo provare a chiuderlo. Interrotto significa che la connessione è stata precedentemente aperta e non funziona correttamente. La seconda condizione determina che lo stato di connessione deve essere chiuso prima di tentare di aprirlo di nuovo in modo che il codice possa essere chiamato ripetutamente.

// Defensive database opening logic.

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

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

Solo un po 'più sulla difensiva.
GBGOLC

1
Dalla coda di revisione: posso chiederti di aggiungere un po 'più di contesto alla tua risposta. Le risposte di solo codice sono difficili da capire. Aiuterà sia il richiedente che i futuri lettori se puoi aggiungere ulteriori informazioni nel tuo post. Vedi anche Spiegazione di risposte interamente basate su codice .
help-info.de

3

Per controllare lo stato di connessione del database puoi semplicemente fare quanto segue

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

2

Per controllare lo stato di OleDbConnection usa questo:

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

State restituire il file ConnectionState

public override ConnectionState State { get; }

Ecco le altre ConnectionStateenumerazioni

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

Uso il modo seguente sqlconnection.state

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

7
connectionState.open()non esiste; intendevi ConnectionState.Open?
Peter Ritchie
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.