Vérifiez si la connexion SQL est ouverte ou fermée


102

Comment vérifier s'il est ouvert ou fermé que j'utilisais

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

cependant, même l'état est «ouvert», il échoue à cette vérification.

Réponses:


175

Vous devriez utiliser SqlConnection.State

par exemple,

using System.Data;

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

2
+1 exactement - utilisez l' SqlConnectionStateénumération comme une énumération et ne la transformez pas en chaîne .....
marc_s

4
J'aurais dû ajouter using System.Data;dans la réponse, à mon humble avis. J'ai oublié cet espace de noms (had using System.Data.SqlClient) et je ne pouvais pas comprendre comment obtenir ConnectionStateun mot-clé jusqu'à ce que je l'ajoute. J'espère que cela aide quelqu'un.
vapcguy

Cela fonctionne-t-il si le serveur (ou quelque chose entre la machine locale et le serveur) a fermé la connexion?
jpmc26

Ne serait-il pas préférable de le dire if (myConnection == null || myConnection.State == ConnectionState.Closed) { //Connection is closed } else { //Connection is open in some way }? De cette façon, si la connexion est nulle, elle est également "fermée".
Arvo Bowen

52

Voici ce que j'utilise:

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

La raison pour laquelle je n'utilise pas simplement:

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

C'est parce que le ConnectionState peut également être:

Broken, Connnecting, Executing, Fetching

En plus de

Open, Closed

En outre, Microsoft déclare que la fermeture et la réouverture de la connexion «actualiseront la valeur de State». Voir ici http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.state(v=vs.110).aspx


Vous devriez tester si vous voulez mySQLConnection.State != ConnectionState.Open && mySQLConnection.State != ConnectionState.Connectingéviter les réinitialisations avec des connexions lentes, n'est-ce pas?
caligari

@caligari Bien que true, aucune garantie n'existe pour DbConnection, donc si vous programmez vers le DbConnection abstrait, soyez prudent.
John Zabroski

1
Je pense personnellement que c'est le genre de problème que vous résolvez en évitant. Je peux peut-être voir le cas d'utilisation de cet extrait de code dans une couche d'application avec état, mais jamais sur le Web?
John Zabroski

John, c'est exactement le cas d'utilisation de ce code. Code exécutant une application serveur qui pourrait servir des pages, se connecter à un autre serveur REST quel qu'il soit. Je ne vois aucun cas où je me connecterais à une base de données serveur dans le code côté client dans une application Web.
therealjumbo

Il y a une mise en garde géante à ce sujet: 1) le stockage local devenant désormais une chose, tôt ou tard (déjà?) Les applications Web qui utilisent le stockage local utiliseront une base de données dans ce stockage. Sinon maintenant, ils le feront sous peu. L'autre chose ici est que mon code n'est probablement pas correctement généralisé pour être utilisé dans une grande application. Mon objectif principal est la programmation intégrée, donc j'apprends toujours du côté serveur.
therealjumbo

24

La documentation .NET dit: State Property: Une combinaison au niveau du bit des valeurs ConnectionState

Alors je pense que tu devrais vérifier

!myConnection.State.HasFlag(ConnectionState.Open)

au lieu de

myConnection.State != ConnectionState.Open

car State peut avoir plusieurs indicateurs.


Je me demande pourquoi c'est enum avec des drapeaux. Étant donné que la valeur de l'élément Close de cette énumération est zéro, State.HasFlag (ConnectionState.Close) renverra true pour toute valeur. Pour moi, cela signifie que je devrais cocher comme "! = Fermer"
Ivan


4
REMARQUE: Je pense qu'il est nécessaire de mentionner que le lien d'Ivan mentionne que vous NE DEVRIEZ PAS utiliser cela comme indicateur. Voir cette réponse spécifique: stackoverflow.com/a/35484965/2499090
Brent Rittenhouse

9

Vérifiez si une connexion MySQL est ouverte

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

Quel est le but de revenir toujours vrai? À ce stade, annulez la méthode. Seulement, vérifiez si la connexion n'est pas ouverte et si c'est le cas, ouvrez-la. Et ... pourquoi écrire 2 fois return true;? placez-le à la fin de la méthode, en dehors du if/ else!
Massimiliano Kraus

En cas de problèmes de réseau, cela donnerait une mauvaise réponse. vous ne pouvez pas être sûr que open ouvrira effectivement.
user613326

@ user613326 en fait, ce ne serait pas le cas. Il n'y a pas de gestion des erreurs dans l'exemple de code, donc tout problème lors de la connexion sera simplement déclenché et vous laissera gérer l'exception. La valeur renvoyée est donc correcte.
Tom Lint

6

vous pouvez également utiliser ceci

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

1
using System.Data;pour tous ceux qui ne savaient pas ou ne savaient pas pourquoi cela ne fonctionnait pas
Coops

5

Ce code est un peu plus défensif, avant d'ouvrir une connexion, vérifiez l'état. Si l'état de la connexion est Broken, nous devons essayer de le fermer. Rupture signifie que la connexion a été précédemment ouverte et ne fonctionne pas correctement. La deuxième condition détermine que l'état de connexion doit être fermé avant de tenter de l'ouvrir à nouveau afin que le code puisse être appelé à plusieurs reprises.

// Defensive database opening logic.

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

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

Être juste un peu plus défensif.
GBGOLC

1
De la file d'attente d'examen: Puis-je vous demander d'ajouter un peu plus de contexte autour de votre réponse. Les réponses basées uniquement sur le code sont difficiles à comprendre. Cela aidera le demandeur et les futurs lecteurs si vous pouvez ajouter plus d'informations dans votre message. Voir également Expliquer les réponses entièrement basées sur le code .
help-info.de

3

Pour vérifier l'état de la connexion à la base de données, vous pouvez simplement faire ce qui suit

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

2

Pour vérifier l'état OleDbConnection, utilisez ceci:

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

State retourner le ConnectionState

public override ConnectionState State { get; }

Voici les autres ConnectionStateénumérations

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

J'utilise la manière suivante sqlconnection.state

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

7
connectionState.open()n'existe pas; voulez-vous dire ConnectionState.Open?
Peter Ritchie
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.