SQL接続が開いているか閉じているかを確認する


102

使用していたのが開いているか閉じているかをどのように確認しますか

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

ただし、状態が「オープン」であっても、このチェックに失敗します。

回答:


175

SqlConnection.Stateを使用する必要があります

例えば、

using System.Data;

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

2
正確に+1- SqlConnectionStateenumをenumとして使用し、それを文字列に変換しないでください.....
marc_s

4
using System.Data;答えに追加すべきだった、IMHO。私はこの名前空間を忘れていて(持っていましたusing System.Data.SqlClient)、ConnectionState追加するまでキーワードとして取得する方法を理解できませんでした。これが誰かを助けることを願っています。
vapcguy 2015

サーバー(またはローカルマシンとサーバーの間の何か)が接続を閉じた場合、これは機能しますか?
jpmc26 2016

言ったほうがいいのではif (myConnection == null || myConnection.State == ConnectionState.Closed) { //Connection is closed } else { //Connection is open in some way }?このようにして、接続がnullの場合も「クローズ」されます。
Arvo Bowen 2017年

52

これが私が使っているものです:

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

私が単に使用していない理由:

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

これは、ConnectionStateも次のようになるためです。

Broken, Connnecting, Executing, Fetching

に加えて

Open, Closed

さらに、Microsoftは、接続を閉じてから再度開くと、「状態の値が更新される」と述べています。こちらをご覧くださいhttp://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.state(v=vs.110).aspx


mySQLConnection.State != ConnectionState.Open && mySQLConnection.State != ConnectionState.Connecting遅い接続でのリセットを避けるためにテストすべきですよね?
カリガリ2014

@caligari trueの場合、DbConnectionは保証されないため、抽象DbConnectionにプログラミングする場合は注意してください。
John Zabroski、2014

1
個人的にはこれを回避することで解決できる問題だと思います。このコードスニペットのユースケースをステートフルアプリケーションレイヤーで見ることができるかもしれませんが、Webにはありませんか?
John Zabroski、2014

ジョン、それはまさにこのコードのユースケースです。ページを提供しているサーバーアプリケーションを実行しているコード、別のRESTサーバーに接続しているコード。Webアプリケーションのクライアント側のコードでサーバーデータベースに接続するケースはありません。
therealjumbo 2014

これには大きな注意点が1つあります。1)ローカルストレージが物事になり、遅かれ早かれ(すでに)ローカルストレージを使用するWebアプリがそのストレージ内のデータベースを使用することになります。今ではない場合、彼らはまもなくします。もう1つは、おそらく私のコードは、大規模なアプリケーションで使用するために適切に一般化されていないことです。私の主な焦点は組み込みプログラミングなので、サーバー側でまだ学習しています。
therealjumbo 2014

24

.NETドキュメントは言う:状態プロパティ:ConnectionState値のビットごとの組み合わせ

だからチェックすべきだと思います

!myConnection.State.HasFlag(ConnectionState.Open)

の代わりに

myConnection.State != ConnectionState.Open

なぜなら、Stateは複数のフラグを持つことができるからです。


なぜこれはフラグ付きの列挙型なのでしょうか。この列挙型のCloseアイテムの値はゼロであるため、State.HasFlag(ConnectionState.Close)はすべての値に対してtrueを返します。私にとっては、「!= Close」としてチェックする必要があることを意味します
Ivan


4
注:Ivanのリンクには、これをフラグとして使用しないでくださいと記載されていることを言及する必要があると思います。この特定の回答を参照してください:stackoverflow.com/a/35484965/2499090
ブレントリッテンハウス

9

MySQL接続が開いているかどうかを確認する

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

常に本当に戻る目的は何ですか?この時点で、メソッドをvoidにします。接続が開いていないかどうかを確認し、開いている場合は開いてください。そして...なぜ2回書くのreturn true;ですか?メソッドの最後のif/の外に置きelseます!
Massimiliano Kraus 2017年

ネットワークの問題が発生した場合、これらは間違った答えを出します。オープンが実際にオープンになるとは確信できません。
user613326

@ user613326実際にはそうではありません。サンプルコードにはエラー処理がないため、接続中に問題が発生すると、例外がスローされ、例外を処理できます。したがって、戻り値は正しいです。
トムリント

6

これも使えます

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

1
using System.Data;知らなかった、またはなぜうまくいかなかったのか
Coops 2013

5

このコードはもう少し防御的です。接続を開く前に状態を確認してください。接続状態がBrokenの場合は、閉じようとする必要があります。壊れているとは、接続が以前に開かれていて、正しく機能していないことを意味します。2番目の条件は、コードを繰り返し呼び出すことができるように、接続状態を再度開く前に閉じる必要があることを決定します。

// Defensive database opening logic.

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

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

もう少し防御的です。
GBGOLC 2017年

1
レビューキューから:回答の前後にコンテキストを追加してください。コードのみの回答は理解が困難です。投稿に情報を追加できれば、質問者と将来の読者の両方に役立ちます。完全にコードベースの回答の説明も参照してください。
help-info.de 2017年

3

データベース接続の状態を確認するには、次の手順を実行するだけです。

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

2

OleDbConnectionの状態を確認するには、次を使用します。

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

State を返す ConnectionState

public override ConnectionState State { get; }

ここに他のConnectionState列挙型があります

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
    }

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.