2012-04-26 54 views
0

在java中,一旦Statement被關閉,就無法訪​​問ResultSet,雖然很多時候你會得到少量的獲取數據使它看起來是開放的。但總的來說,這違背了API規則。在命令關閉後訪問OleDBDataReader是否安全

但是在OLEDB中,我想知道是否同樣的規則適用於命令和讀者。例如,下面的代碼是否100%安全?即使命令處置,SQL提取遊標是否仍保持打開狀態?

public OleDbDataReader ExecuteReader(string sql, OleDbConnection connection) 
{ 
    using (OleDbCommand command = CreateCommand(sql, connection)) 
    { 
    return command.ExecuteReader(); 
    } 
} 

回答

1

這是不推薦的。你爲什麼要這樣做?

當命令處置時(這發生在執行離開使用塊時),連接將不會關閉,因此您可以繼續使用DataReader。

然而,這是一個非常糟糕的主意:

  • 你不能得到確保連接將被關閉,因爲它依賴於外部代碼。

  • 這可以將鎖定在數據庫中,這樣就會出現爭用問題。

  • 您的閱讀器使用的連接保持「繁忙」狀態,因此無法重複使用。

您應該始終確保閱讀器以及相關連接已關閉。通過這種設計,您應該依賴返回的DataReader的用戶來關閉閱讀器和連接。或者至少讀者,如果您使用接收CommandBehavior的SqlCommand.ExecuteReader重載,您可以在其中設置CloseConnection,以便讀取器關閉時自動關閉連接。

但我堅持認爲,不應該讓DataReader長時間保持打開狀態。數據讀取器應該儘可能快地迭代和關閉。它可以避免將數據傳輸到DataTable以及使用它的開銷。即當你綁定到一個控件時,比如DataGridView,你可以直接將數據綁定到控件上,避免了DataTable的中間使用,這需要額外的處理時間和內存(數據到數據表單然後控制,而不是直接從數據源控制)。

所以,也許你可以做到這一點,但無限期地,你不應該!

+0

非常感謝。我正在檢查預先存在的代碼並且遇到它。只需要一些堅實的理由來重新設計這種方法。 – 2012-04-27 14:54:47