[英]using on SQLDataReader
我知道我之前提過了一個相關的問題。 我只是想到了另一個想法。
using (SqlConnection conn = new SqlConnection('blah blah'))
{
using(SqlCommand cmd = new SqlCommand(sqlStatement, conn))
{
conn.open();
// *** do I need to put this in using as well? ***
SqlDataReader dr = cmd.ExecuteReader()
{
While(dr.Read())
{
//read here
}
}
}
}
參數是:由於SqlDataReader
dr
對象不是一個新的OBJECT LIKE連接或命令對象,它只是一個指向cmd.ExecuteReader()
方法的引用,我是否需要將閱讀器放在一個using
。 (現在基於我以前的帖子,我的理解是任何使用IDisposable
對象都需要放在一個using
,而SQLDataReader
繼承自IDisposable
,所以我需要把它。我的判斷是否正確?)我只是因為它不是一個新的對象,它會在處理一個只是指向命令的引用指針的對象時引起任何問題嗎?
非常感謝
我覺得你錯了。 dr
是對cmd.ExecuteReader
返回的對象的cmd.ExecuteReader
,它將成為一個新對象。 在你的例子中,什么都不會處理dr
,所以是的,它需要在using
,或手動處置。
您對IDisposable
實現者需要 using
判斷不正確。 他們會在外面運作良好。 一個using
語句只是一個try ... finally
語法糖try ... finally
。 實現IDisposable
事情應該讓Dispose
調用,因為它們表明他們需要以確定的方式處理某些狀態。
請注意,如果您不調用Dispose
,它並不總是一個問題。 一些對象還實現了終結器,它將由垃圾收集器觸發。 如果他們沒有實現終結器,他們可能會使未管理的內存無法恢復。 在您的申請結束之前,這將一直無法恢復。 所有托管內存最終都會被回收,除非它不適合垃圾回收。
重新編寫:
using (SqlConnection conn = new SqlConnection('blah blah'))
using(SqlCommand cmd = new SqlCommand(sqlStatement, conn))
{
conn.open();
using (SqlDataReader dr = cmd.ExecuteReader())
{
while (dr.Read())
{
//read here
}
}
}
您應該將數據讀取器包裝在using語句中,因為ExecuteReader方法正在創建一個也應該被丟棄的新數據讀取器實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.