3

我试图了解 DbConnection 和 DbCommand,以及在使用后处理这些对象的正确方法。

以下是我的代码片段。通过在 DbConnection 和 DbCommand 上使用“using 语句”,就足够了吗?我试图防止可能的内存泄漏。

第二个问题,

我必须处置 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与调用 in的块using相同。try/finallydispose()finally

DbCommand应该在using它实现时包含在一个语句中IDisposable

请注意,这DbCommand实际上是一个抽象类,因此您需要

  • 从中衍生
  • 接口代码 ( IDbCommand)
  • 使用预定义的派生类之一,例如SqlCommand.

DbConnection也是一个抽象类,所以你也需要做一些类似于我上面建议的DbCommand事情。

一般的建议是,如果一个对象实现了IDisposable,它应该被包装在一个using语句中,以便Dispose()调用以释放资源,即使在语句块中抛出异常也是如此。那么在您的示例中,一个好的做法是将每个连接、命令DataTableDbDataAdapter对象包装在一个using语句中。

于 2010-03-18T23:47:13.537 回答
1

是的,我会在 DbCommand 对象上调用 Dispose。一般来说,规则应该是,如果它实现了 IDisposable,你应该在适当的时候调用它的 Dispose 方法。您的代码在我看来格式正确。我认为你在正确的轨道上。

编辑实际上,您可能还希望将 DbDataAdapter 包装在 using 语句中,因为它也实现了 IDisposable。

于 2010-03-18T23:48:01.187 回答
1

像你一样将对象包裹在using块中就足够了;Dispose即使抛出异常,这也会调用代码。

是的,您应该对DbCommand对象以及DbDataAdapter和 执行此操作DataTable。他们都(直接或间接)实施IDisposable

于 2010-03-18T23:49:37.503 回答