簡體   English   中英

C#+處置DbConnection和DbCommand並捕獲錯誤

[英]C# + Disposing DbConnection and DbCommand and catching error

我試圖了解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
     }
}

使用using是一樣的一個try/finally與塊dispose()調用在finally

DbCommand實現IDisposable應將其包裝在using語句中。

請注意, DbCommand實際上是一個抽象類,因此您將需要

  • 從中衍生
  • 接口代碼( IDbCommand
  • 使用預定義的派生類之一,例如SqlCommand

DbConnection也是一個抽象類,因此您也需要為此做類似上面為DbCommand建議的操作。

一般建議是,如果對象實現IDisposable ,則應將其包裝在using語句中,以便調用Dispose()以釋放資源,即使在語句塊中引發了異常也是如此。 然后,在您的示例中,一個好的做法是將每個連接,命令, DataTableDbDataAdapter對象包裝在using語句中。

是的,我會在DbCommand對象上調用Dispose。 通常,規則應為:如果實現IDisposable,則應在適當時調用其Dispose方法。 您的代碼對我來說看起來格式正確。 我認為您在正確的軌道上。

編輯實際上,您可能還希望將DbDataAdapter包裝在using語句中,因為它也實現了IDisposable。

using塊包裝對象應該足夠了; 即使拋出異常,這也會使代碼調用Dispose

是的,您應該對DbCommand對象以及DbDataAdapterDataTable 它們都(直接或間接)實現IDisposable

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM