Compruebe si la conexión SQL está abierta o cerrada

102

¿Cómo se comprueba si está abierto o cerrado? Estaba usando

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

sin embargo, incluso si el Estado es "Abierto", falla en esta verificación.

Pedro Franco
fuente

Respuestas:

175

Deberías estar usando SqlConnection.State

p.ej,

using System.Data;

if (myConnection != null && myConnection.State == ConnectionState.Closed)
{
   // do something
   // ...
}
PoLáKoSz
fuente
2
+1 exactamente - use la SqlConnectionStateenumeración como enumeración y no la convierta en una cadena .....
marc_s
4
Debería haber agregado using System.Data;la respuesta, en mi humilde opinión. Olvidé este espacio de nombres (tenía using System.Data.SqlClient) y no pude averiguar cómo obtenerlo ConnectionStatecomo palabra clave hasta que lo agregué. Espero que esto ayude a alguien.
vapcguy
¿Funciona esto si el servidor (o algo entre la máquina local y el servidor) cerró la conexión?
jpmc26
¿No sería mejor decirlo if (myConnection == null || myConnection.State == ConnectionState.Closed) { //Connection is closed } else { //Connection is open in some way }? De esta forma, si la conexión es nula, también se "cierra".
Arvo Bowen
52

Esto es lo que estoy usando:

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

La razón por la que no estoy usando simplemente:

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

Es porque ConnectionState también puede ser:

Broken, Connnecting, Executing, Fetching

Además de

Open, Closed

Además, Microsoft afirma que Cerrar y luego volver a abrir la conexión "actualizará el valor de Estado". Vea aquí http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.state(v=vs.110).aspx

therealjumbo
fuente
Debería probar si mySQLConnection.State != ConnectionState.Open && mySQLConnection.State != ConnectionState.Connectingpara evitar reinicios con conexiones lentas, ¿no es así?
Caligari
@caligari Si bien es cierto, no existe garantía para DbConnection, así que si programa en el DbConnection abstracto, tenga cuidado.
John Zabroski
1
Personalmente, creo que este es el tipo de problema que se resuelve evitando. Tal vez pueda ver el caso de uso de este fragmento de código en una capa de aplicación con estado, pero nunca en la Web.
John Zabroski
John, ese es exactamente el caso de uso de este código. Código que ejecuta una aplicación de servidor que podría estar sirviendo páginas, conectándose a otro servidor REST lo que sea. No veo ningún caso en el que me conecte a una base de datos del servidor en el código del lado del cliente en una aplicación web.
therealjumbo
Hay una advertencia gigante con eso: 1) con el almacenamiento local ahora en una cosa, tarde o temprano (¿ya?) Las aplicaciones web que usan almacenamiento local usarán una base de datos en ese almacenamiento. Si no es ahora, lo harán en breve. La otra cosa aquí es que mi código probablemente no esté correctamente generalizado para ser utilizado en una aplicación grande. Mi enfoque principal es la programación integrada, por lo que todavía estoy aprendiendo del lado del servidor.
therealjumbo
24

La documentación de .NET dice: Propiedad de estado: una combinación bit a bit de los valores de ConnectionState

Entonces creo que deberías comprobar

!myConnection.State.HasFlag(ConnectionState.Open)

en vez de

myConnection.State != ConnectionState.Open

porque el estado puede tener múltiples banderas.

csname1910
fuente
Me pregunto por qué esto es enumeración con banderas. Dado que el valor del elemento Close de esta enumeración es cero, State.HasFlag (ConnectionState.Close) devolverá verdadero para cualquier valor. Para mí, significa que debería marcar como "! = Cerrar"
Ivan
4
NOTA: Creo que es necesario mencionar que el enlace de Ivan menciona que NO DEBE usar esto como banderas. Vea esta respuesta específica: stackoverflow.com/a/35484965/2499090
Brent Rittenhouse
9

Compruebe si una conexión MySQL está abierta

ConnectionState state = connection.State;
if (state == ConnectionState.Open)
{
    return true;
}
else
{
    connection.Open();
    return true;
}
Louie Bacaj
fuente
¿Cuál es el propósito de volver siempre cierto? En este punto, anule el método. Solo, compruebe si la conexión no está abierta y, si lo está, ábrala. Y ... ¿por qué escribir 2 veces return true;? ponerlo al final del método, fuera de if/ else!
Massimiliano Kraus
En caso de problemas de red, estos darían una respuesta incorrecta. no puede estar seguro de que open realmente se abrirá.
user613326
@ user613326 en realidad, no lo haría. No hay manejo de errores en el código de ejemplo, por lo que cualquier problema durante la conexión simplemente arrojará y dejará que maneje la excepción. Por tanto, el valor devuelto es correcto.
Tom Lint
6

también puedes usar esto

if (SQLCON.State == ConnectionState.Closed)
{
     SQLCON.Open();
}
bitu pascal
fuente
1
using System.Data;para cualquiera que no lo supiera o no supiera por qué no estaba funcionando
Coops
5

Este código es un poco más defensivo, antes de abrir una conexión, verifique el estado. Si el estado de la conexión está roto, deberíamos intentar cerrarlo. Roto significa que la conexión se abrió anteriormente y no funciona correctamente. La segunda condición determina que el estado de conexión debe cerrarse antes de intentar abrirlo nuevamente para que el código se pueda llamar repetidamente.

// Defensive database opening logic.

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

if (_databaseConnection.State == ConnectionState.Closed) {
    _databaseConnection.Open();
}
GBGOLC
fuente
Solo estar un poco más a la defensiva.
GBGOLC
1
De la cola de revisión: ¿ Puedo solicitarle que agregue un poco más de contexto en torno a su respuesta? Las respuestas de solo código son difíciles de entender. Ayudará tanto al autor de la pregunta como a los futuros lectores si puede agregar más información en su publicación. Consulte también Explicación de respuestas completamente basadas en código .
help-info.de
3

Para verificar el estado de conexión de la base de datos, simplemente puede hacer lo siguiente

if(con.State == ConnectionState.Open){}
ImranNaqvi
fuente
2

Para verificar el estado de OleDbConnection, use esto:

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

State devuelve el ConnectionState

public override ConnectionState State { get; }

Aquí están las otras ConnectionStateenumeraciones

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
    }
Manjunath Bilwar
fuente
-5

Uso de la siguiente manera sqlconnection.state

if(conexion.state != connectionState.open())
   conexion.open();
Guillermo
fuente
7
connectionState.open()no existe; ¿te refieres ConnectionState.Open?
Peter Ritchie