3

私はDbConnectionとDbCommand、および使用後にこれらのオブジェクトを破棄する適切な方法を理解しようとしています。

以下は私が持っているコードスニペットです。DbConnectionとDbCommandで「usingステートメント」を使用することで十分でしょうか?メモリリークの可能性を防止しようとしています。

2番目の質問、

DbCommandオブジェクトを破棄する必要がありますか?

どうもありがとう

DbProviderFactory fac = DbProviderFactories.GetFactory(this.DatabaseProviderName);

using (DbConnection dbConn = fac.CreateConnection())
{
     dbConn.ConnectionString = this.ConnectionString;

     using (DbCommand comm = fac.CreateCommand())
     {
          comm.CommandText = "select * from aTable";
          comm.Connection = dbConn;
          DataTable targetTable = new DataTable();

          DbDataAdapter facDA = fac.CreateDataAdapter();
          facDA.SelectCommand = comm;
          facDA.Fill(targetTable);

          //assuming Adapter would open / close connection (right assumption?)

          //do something with the datatable
     }
}
4

3 に答える 3

6

使用は、で呼び出されたブロックとusing同じです。try/finallydispose()finally

DbCommandusingを実装するときにステートメントでラップする必要がありますIDisposable

これDbCommandは実際には抽象クラスであるため、次のいずれかを行う必要があることに注意してください。

  • それから派生する
  • インターフェイスへのコード(IDbCommand
  • などの事前定義された派生クラスの1つを使用しSqlCommandます。

DbConnectionは抽象クラスでもあるので、これについても上記で提案したのと同様のことを行う必要がありDbCommandます。

一般的な推奨事項は、オブジェクトが実装する場合、ステートメントブロック内で例外がスローされた場合でも、リソースを解放するために呼び出されるようなステートメントIDisposableでラップする必要があることです。この例では、接続、コマンド、およびオブジェクトのそれぞれをステートメントでラップすることをお勧めします。usingDispose()DataTableDbDataAdapterusing

于 2010-03-18T23:47:13.537 に答える
1

はい、DbCommandオブジェクトでDisposeを呼び出します。一般に、IDisposableを実装する場合は、必要に応じてDisposeメソッドを呼び出す必要があります。あなたのコードは私にはよく形成されているように見えます。あなたは正しい方向に進んでいると思います。

編集実際には、DbDataAdapterもIDisposableを実装しているため、usingステートメントでラップすることもできます。

于 2010-03-18T23:48:01.187 に答える
1

オブジェクトをusingブロックでラップするだけで十分です。Disposeこれにより、例外がスローされた場合でもコードが呼び出されます。

そして、はい、DbCommandオブジェクトと、DbDataAdapterおよび。に対してそれを行う必要がありますDataTable。それらはすべて(直接的または間接的に)実装しIDisposableます。

于 2010-03-18T23:49:37.503 に答える