[英]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()
以釋放資源,即使在語句塊中引發了異常也是如此。 然后,在您的示例中,一個好的做法是將每個連接,命令, DataTable
和DbDataAdapter
對象包裝在using
語句中。
是的,我會在DbCommand對象上調用Dispose。 通常,規則應為:如果實現IDisposable,則應在適當時調用其Dispose方法。 您的代碼對我來說看起來格式正確。 我認為您在正確的軌道上。
編輯實際上,您可能還希望將DbDataAdapter包裝在using語句中,因為它也實現了IDisposable。
using
塊包裝對象應該足夠了; 即使拋出異常,這也會使代碼調用Dispose
。
是的,您應該對DbCommand
對象以及DbDataAdapter
和DataTable
。 它們都(直接或間接)實現IDisposable
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.