3

私は以下のコードを持っています:

    using (SqlCommand command = new SqlCommand())
    {

        command.CommandType = System.Data.CommandType.StoredProcedure;
        command.Connection = new SqlConnection();
        command.CommandText = "";

        command.Parameters.Add(new SqlParameter("@ExperienceLevel", 3).Direction = System.Data.ParameterDirection.Input);

        SqlDataReader dataReader = command.ExecuteReader();
   }

私が現在宣言している SqlConnection を宣言することで、機能的な影響はありますか?:

using (SqlCommand command = new SqlCommand())
using (SqlConnection connection = new SqlConnection())

ありがとう

4

4 に答える 4

5

はい、違いがあります。を破棄しても、関連付けられているSqlCommandが自動的に破棄されるわけではありません。SqlConnectionそのように接続をリークすることができ、ADO.NET 接続プールに干渉します。このコードの実行中にデータベース サーバーのアクティビティを見ると、新しい接続が開かれ、閉じられていないことがわかります。

常に 2 番目のバージョンを使用する必要があります。実際、SqlConnectionオブジェクトは本当に必要なものDisposeです。できるだけ早く実装するものは常に破棄する必要がありますが、 a を破棄しないと特に危険です。IDisposableSqlConnection

于 2010-03-24T21:22:10.477 に答える
3

はい、リソースごとに 1 つ、2 つの using ブロックを使用することをお勧めします。

この場合、1 つだけを使用できますが、コマンドの周りではなく、接続の周りに配置する必要があります。

しかし、あなたは本当にそのような詳細を知りたくないし、気にしたくもありません。クラスが IDispsoable インターフェイスを実装する場合using() { }は、特別な理由がない限り、そのインスタンスをブロックで使用します。

于 2010-03-24T21:22:31.037 に答える
2

次のパターンを使用します。

using(var connection = new SqlConnection("ConnectionName"))
using(var command = new SqlCommand())
{
   command.Connection = connection;
   // setup command
   var reader = command.ExecuteReader();
   // read from the reader
   reader.Close();
}
于 2010-03-24T21:28:03.817 に答える
0

はい、以下のコードは SqlConnection を正しく破棄しますが、上記のコードはそうしません。usingブロック (内部的に ... として実装)tryfinally、ブロックを終了する方法に関係なく、オブジェクトが確実に破棄されるようにします。

于 2010-03-24T21:21:08.817 に答える