1

Using()を含むステートメントを使用しようとしていSqlConnectionます。

私はSqlConnectionページプロパティをそのようにしました...

public SqlConnection baseConnection
{
    get { return new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); }
}

次に、そのusing()ようなステートメントを作成しました...

using (baseConnection)
            {
                SqlCommand select = new SqlCommand("SELECT * FROM TABLE", baseConnection);
                baseConnection.Open();
                SqlDataReader reader = select.ExecuteReader();

                //... other irrelevant code
            }

しかし、コードを実行すると例外が発生します

例外の詳細: System.InvalidOperationException: ExecuteReader には、オープンで使用可能な接続が必要です。接続の現在の状態は閉じています

例外を理解していますが、理解していないのは、接続を開いたときに接続が開かないのはなぜbaseConnection.Open()ですか?

私はサイト全体でこの接続を使用していますが、ページのプロパティとしてカスタム基本クラスに配置したいので、入力し続ける必要はありません。これは許されませんか?

4

3 に答える 3

6

あなたの例で見つけた問題

baseConnectionプロパティをリクエストするたびに、新しい SqlConnection オブジェクトを取得します

問題のあるコード:

public SqlConnection baseConnection
{
    get { return new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); }
}

修正コード

private SqlConnection _baseConnection;
public SqlConnection BaseConnection
{
    get { return _baseConnection = _baseConnection ?? new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); }
}

ここでreturn _baseConnection = _baseConnection ?? new SqlConnection()は、C# の Null Coaleasing 演算子を使用しています。つまり、変数が null の??場合、新しいインスタンスが作成されます。_baseConnection

私の前提
BaseConnectionプロパティは一部で定義されておりBaseClass、派生クラスはサブ派生クラスでさらに拡張されていません。このようにして、派生クラスの型ごとに 1 つの SqlConnection を使用できます。

于 2013-03-20T10:07:31.673 に答える
1

コードは次のようになります。

using (var myConnection = baseConnection)
            {
                SqlCommand select = new SqlCommand("SELECT * FROM TABLE", myConnection );
                myConnection .Open();
                SqlDataReader reader = select.ExecuteReader();

                //... other irrelevant code
            }
于 2013-03-20T10:12:24.877 に答える