簡體   English   中英

在SQLDataReader上使用

[英]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.

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