61

このアプローチを効率的に使用できますか?

using(SqlCommand cmd = new SqlCommand("GetSomething", new SqlConnection(Config.ConnectionString))
{
    cmd.Connection.Open();
    // set up parameters and CommandType to StoredProcedure etc. etc.
    cmd.ExecuteNonQuery();
}

私の懸念は: SqlCommand の Dispose メソッド (using ブロックを終了するときに呼び出される) は、基になる SqlConnection オブジェクトを閉じるかどうかです。

4

4 に答える 4

123

いいえ、 を処分してSqlCommandも接続には影響しません。より良いアプローチはSqlConnection、 using ブロックにもラップすることです。

using (SqlConnection conn = new SqlConnection(connstring))
{
    conn.Open();
    using (SqlCommand cmd = new SqlCommand(cmdstring, conn))
    {
        cmd.ExecuteNonQuery();
    }
}

それ以外の場合、それを使用していたコマンドが破棄されたという事実によって、接続は変更されません (おそらくそれがあなたの望みですか?)。ただし、接続も破棄する必要があり、コマンドよりも破棄する方が重要であることに注意してください。

編集:

私はこれをテストしました:

SqlConnection conn = new SqlConnection(connstring);
conn.Open();

using (SqlCommand cmd = new SqlCommand("select field from table where fieldid = 1", conn))
{
    Console.WriteLine(cmd.ExecuteScalar().ToString());
}

using (SqlCommand cmd = new SqlCommand("select field from table where fieldid = 2", conn))
{
    Console.WriteLine(cmd.ExecuteScalar().ToString());
}

conn.Dispose();  

最初のコマンドは、using ブロックが終了したときに破棄されました。接続はまだ開いていて、2 番目のコマンドに適していました。

したがって、コマンドを破棄しても、それが使用していた接続は確実に破棄されません。

于 2008-09-13T22:20:59.667 に答える
11

多くの SqlCommand(s) が同じ SqlConnection を (再) 使用できるため、SqlCommand.Dispose は十分ではありません。SqlConnection に注目してください。

于 2008-10-08T22:48:42.697 に答える
-12

私はこのパターンを使用します。アプリのどこかにこのプライベートメソッドがあります:

private void DisposeCommand(SqlCommand cmd)
{
    try
    {
        if (cmd != null)
        {
            if (cmd.Connection != null)
            {
                cmd.Connection.Close();
                cmd.Connection.Dispose();
            }
            cmd.Dispose();
        }
    }
    catch { } //don't blow up
}

次に、常に try ブロックで SQL コマンドと接続を作成し (ただし、using ブロックでラップすることはありません)、常に次のように finally ブロックを持ちます。

    finally
    {
        DisposeCommand(cmd);
    }

コマンド オブジェクトのプロパティである接続オブジェクトは、この状況では using ブロックを厄介なものにしますが、このパターンはコードを乱雑にすることなく仕事を完了します。

于 2011-04-13T18:52:08.473 に答える