0

今日、私は以下のようなコードのスニペットに気づきました。

public class Test
{
    SqlConnection connection1 = 
      new SqlConnection(ConfigurationManager.ConnectionStrings["c1"].ToString());
    SqlConnection connection2 = 
      new SqlConnection(ConfigurationManager.ConnectionStrings["c2"].ToString());

    public void Method1()
    {
        using (connection1)
        {
            connection1.Open();
            using (SqlCommand newSqlCommand = new SqlCommand("text",connection2))
            {
            // do something       
            }         
        }
    }

    public void Method2()
    {
        using (connection1)
        {
            // do something                
        }
    }
}

クラス内の対応するメソッドを呼び出すときではなく、クラスを作成するときに接続を開きたいのはなぜだろうかと思っています。

編集:私はおそらく代わりにコード全体を投稿するべきでした。したがって、接続1を開いている場所はわかりますが、どこにも開かれていない別のSQL接続(connection2)を使用してsqlコマンドをインスタンス化しています。ここで何が欠けていますか?

ありがとう、

4

4 に答える 4

1

この行は、接続オブジェクトを初期化するだけです。このオブジェクトは、後でデータベースサーバーへの接続を開くために使用できます。

SqlConnection connection1 = 
new SqlConnection(ConfigurationManager.ConnectionStrings["c1"].ToString());

私が知っているのは、スコープの後にオブジェクトを破棄する(Connectionオブジェクトの場合は自動的に閉じる)ので、他のオブジェクトタイプ(Connection以外)で問題が発生する可能性があるため、このような使用はお勧めしません。 disposeが呼び出された後は使用しないでください。

于 2012-10-06T01:59:14.607 に答える
0

connection1 = new SqlConnection(...)実際には接続を開きません。接続オブジェクトを作成するだけです。

connection1.Open();実際に開くには、電話する必要があります。usingこれはステートメントブロック内で実行できます。

詳細については、このMSDNページを参照してください。

于 2012-10-06T01:47:36.597 に答える
0

それも

  • クラスで実行されるメソッドへの単一の呼び出しのみを強制するためにこのように記述されています
  • 2つのメソッドを呼び出すと、ObjectDisposed例外がスローされて意図せず混乱する
  • 省略したブロックに接続再初期化コードが含まれています。
于 2012-10-06T01:58:57.753 に答える
0

コードは危険です。Method1を呼び出してからMethod2(またはその逆)を呼び出すと、エラーが発生します(接続文字列が初期化されていません)。このエラーは、usingステートメントが接続を閉じ、オブジェクトを破棄するために発生します。disposeが呼び出されたときに何が起こるかを再確認しました...接続文字列がクリアされます(そしておそらく私が気づかなかった他のいくつかのこと)。

廃棄されたオブジェクトを再利用する必要はありません。

新しい接続オブジェクトをインスタンス化するコストは重要ではないので、必要に応じてオブジェクトを作成します。コードの重複を減らすためのファクトリメソッドを少し使用して、次のように変更します。-

    private static SqlConnection GetSqlConnection()
    {
        return new SqlConnection(ConfigurationManager.ConnectionStrings["c1"].ToString());
    }

    private void Method1()
    {
        using (var conn = GetSqlConnection())
        {
            conn.Open();
            // do stuff...
        }
    }
    private void Method2()
    {
        using (var conn = GetSqlConnection())
        {
            conn.Open();
            // do other stuff...
        }
    }

もちろん、この問題に取り組むにはさまざまな方法があります。これは1つにすぎず、実際には非常に単純な方法です...しかし、これは良い出発点であり、安全です:-)

于 2012-10-06T04:39:05.330 に答える