3

以下に示すように、using句内にSQLConnectionがある場合、接続を明示的に閉じる必要がありますか?

protected SqlConnection Connection 
{
    get
    {
       if (this.connection == null)
       {
           this.connection = new SqlConnection(this.ConnectionString);
       }
       if (this.connection.State != ConnectionState.Open)
       {
           this.connection.Open();
       }

       return this.connection;
    }
} 

using (SqlConnection connection = this.Connection)
{
    using (SqlCommand cmd = connection.CreateCommand())
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "....";

        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                etc
            }
        }
    }
}
4

3 に答える 3

3

いいえ、しません。接続がすでに開いている場合、接続のDispose()メソッドはCloseを呼び出します。

John Gathogoが、必要になるたびに新しい接続オブジェクトを作成するように提案しているので、コードも変更する必要があります。2回目に接続を使用しようとすると、コードは既に破棄されているため、コードはそのまま失敗します。

ADO.NETは、接続プーリングを使用して、Openを呼び出すすべてのユーザーに提供するオープン接続のプールを保持します。これは、プールに利用可能な接続がある限り、新しい接続を作成して開くのに費用がかからないことを意味します。接続を必要以上に長く開いたままにすると、パフォーマンスが低下します。

于 2012-06-21T09:18:22.197 に答える
3

usingブロックは常にを呼び出し、Dispose接続を閉じます。

ただし、接続オブジェクトを保持していて、再利用する予定です。これは、一度破棄すると不可能になります。接続オブジェクトを保持するのではなく、必要に応じて破棄して新しいオブジェクトを作成する必要があります。データベースへの実際の接続はプールされるため、新しい接続オブジェクトを作成すると、プールからの接続の1つが再利用されます。接続オブジェクトを破棄すると、実際の接続がプールに返されます。

于 2012-06-21T09:33:40.917 に答える
1

コードを以下に簡単に変更して、目的を達成できます。

   using (SqlConnection connection = new SqlConnection(this.ConnectionString))
   {
      connection.Open();
      using (SqlCommand cmd = connection.CreateCommand())
      {
         cmd.CommandType = CommandType.StoredProcedure;
         cmd.CommandText = "....";

         using (SqlDataReader reader = cmd.ExecuteReader())
         {
            while (reader.Read())
            {
               //etc
            }
         }
      }
   }

ランタイムは、接続を閉じてリソースを破棄します。

于 2012-06-21T09:21:13.437 に答える