C#+处理DbConnection和DbCommand并捕获错误

时间:2010-03-18 23:44:13

标签: c# dbconnection

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

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

第二个问题,

我是否必须处理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
     }
}

3 个答案:

答案 0 :(得分:6)

使用using

try/finally中调用dispose()的{​​{1}}块相同。

finally应在DbCommand语句中包含,因为它实现了using

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

  • 从中衍生出来
  • 代码到接口(DbCommand
  • 使用其中一个预定义的派生类,例如IDbCommand

SqlCommand也是一个抽象类,所以你需要做一些类似我上面提到的类似DbConnection的事情。

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

答案 1 :(得分:1)

是的,我会在DbCommand对象上调用Dispose。通常,规则应该是如果它实现了IDisposable,则应在适当时调用其Dispose方法。你的代码看起来很好。我认为你走在正确的轨道上。

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

答案 2 :(得分:1)

using块中的对象包裹起来应该足够了;即使抛出异常,这也会使代码调用Dispose

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