2011-04-27 57 views
2

我正在使用Enteprise庫來查詢我的數據庫。當我運行查詢時,我依賴於存儲過程。目前,我正在使用的代碼如下所示:C#讀者處理審閱

Database database = DatabaseFactory.CreateDatabase(); 
DbCommand command = database.GetStoredProcCommand("MyStoredProcedureName"); 

database.AddInParameter(command, "filter", DbType.String, filter); 

Result result = null; 
using (IDataReader reader = database.ExecuteReader(command)) 
{ 
    if (reader.Read()) 
    result = new Result(reader); 
} 
return result; 

我如何可以肯定的是我的讀者正在關閉?我注意到我的應用程序有時無法加載後續加載。我懷疑有些東西正在被打開。但我無法弄清楚如何追蹤它。

根據上面顯示的代碼,不應該因爲「使用」而關閉並處理讀取器?

謝謝!

回答

1

讀者保證關閉,因爲它被包裹在using。但是,DbCommand也實現了IDisposable,並且沒有使用/處置調用它。

Database database = DatabaseFactory.CreateDatabase(); 
using(DbCommand command = database.GetStoredProcCommand("MyStoredProcedureName")) 
{ 
    //snip (no change) 
} 
return result; 

讀者不代表底層連接,只是讀取響應的緩衝區。

2

讀者正在處理和關閉,但DbCommand不是。你應該把它放在使用說明中。

0

由於您在using塊使用IDataReader,當它超出範圍可以保證它被設置(並因此關閉)。如另一張海報中提到的,不要忘記把你的DbCommand放在一個使用區塊中,以便妥善處理。

0

是的,using塊確保讀者將被丟棄。

但是,您應該也處置您的命令和連接對象。如果你不這樣做,它們將不會被關閉,直到垃圾收集器開始移除它們,因此數據庫連接將保持打開狀態。如果你打開了很多連接,數據庫最終會拒絕新的連接。

1

你負責處理讀者。您沒有注意處理DbCommand和數據庫對象。不知道他們是什麼,但他們確實也實施了IDisposable。他們總是這樣做。使用聲明以最熟悉的方式嵌入您的

其中一個不太明顯的錯誤是:

using (var obj = new Foo()) 
using (var obj2 = new Bar()) { 
    // etc.. 
} 

這是非常漂亮,用C#IDE的支持,但它縮進恰到好處。或者只是明確表達一下,程序員的特點是編寫代碼,讓任何人都明白:「哇,夥計們知道他的東西沒有工具」。那很好。