2

私の C# プログラムから、SQL 接続を開き、テーブルを更新します。その後、接続を閉じます。また、Management Studio のアクティビティ モニターで確認すると、新しいプロセスが作成され、プログラムから SQL 接続を閉じても、プロセスはアクティビティ モニターに残っています。このプロセスがどのように動作するかを教えてください。これらのプロセスを明示的にクリアする必要がありますか? ありがとう。

4

2 に答える 2

5

ここでプロセスの概念を間違って使用していると思います。

ADO.NET はconnection pool. これはOpen、SqlConnection インスタンスでメソッドを呼び出すときに、データベースへの新しい物理接続を開くのではなく、単に既存のプールから 1 つを引き出すことを意味します。またClose、接続を閉じるのではなく、接続を再利用するために接続プールに戻すだけです。

接続プールはアプリケーションのプロセス内に存在し、接続文字列ごとに存在します。

これらのプロセスを明示的にクリアする必要がありますか?

いいえ、必要なのは、すべてのIDisposableリソース (接続やコマンドなど) をusingステートメントでラップしていることを確認することだけです。この方法では、Close メソッドを明示的に呼び出す必要さえありません。例外が発生した場合でも、コードによってすべてが適切に破棄されます。

string connectionString = ...
using (var conn = new SqlConnection(connectionString))
using (var cmd = conn.CreateCommand())
{
    conn.Open();
    cmd.CommandText = "SELECT id FROM foo";
    using (var reader = cmd.ExecuteReader())
    {
        while (reader.Read())
        {
            int id = reader.GetInt32(reader.GetOrdinal("id"));
            Console.WriteLine(id);
        }
    }
}
于 2013-03-15T07:24:48.703 に答える
0

必ず接続を破棄してください。最善の策は、using() ブロックです。

using ( var con = new SqlConnection("???") )
{
   using ( var cmd = con.CreateCommand() )
   {
      // do SQL with cmd
   }
}
于 2013-03-15T07:26:03.163 に答える