簡體   English   中英

沒有任何SELECT(!):“已經有與此連接關聯的打開的DataReader”

[英]Without any SELECT(!): “There is already an open DataReader associated with this Connection”

我知道有很多問題要問“已經有一個與此連接相關聯的打開的DataReader”(編輯:最初寫為“ Command”)-但是在所有情況下都涉及一些SELECT命令。

我的情況不同:在這台計算機上, 不執行SELECT命令 (它們在不同的物理計算機上),僅執行INSERT和UPDATE命令。

怎么會這樣 仍然可以使用command.ExecuteNonQuery()command.Prepare()打開DataReader嗎? 那將是一個WTF,但至少是一個解釋。

回顧了SqlCommandOleDbCommand的參考源之后,它們兩者的ExecuteNonQuery方法實現中都有一些快速路徑,這些路徑將嘗試避免打開數據讀取器,但是它們都有一條較慢的路徑,這將退回到使用數據讀取器的方式(顯然,數據讀取器路徑必須處理所有可能的選項,並且他們不想重復所有這些代碼,並非沒有道理)。

我懷疑您用來連接到哪個選項1都會有類似的實現。 因此,首先,不必是導致沖突的SELECT

該修復程序應該很簡單,並且是很好的一般建議。 不要共享任何數據庫對象。 當然,您的連接字符串有一個來源,但是,通常,如果您需要一個連接對象,請在該處添加new對象,然后在using語句中使用它。 命令對象相同。 對於讀者來說,你不會new起來自己,但你仍然希望using

如果不重用數據庫對象,則永遠不會出現此錯誤。 唯一的例外(在我的書中)是,如果您要共享客戶端,則使用客戶端控制的事務(例如TransactionScope或類似TransactionScope )。 但是您仍然不需要共享命令對象。 而且,如果事務范圍如此之廣,以至於您丟失了對其執行的所有命令的跟蹤,那么我建議它太大了。


1上次查看時,有幾個IDbConnection等層次結構的競爭於特定實現,另外可以使用OleDbCommand和family。

基於Bradley Grainger的評論(MySqlConnection的線程安全性問題),我可以通過確保沒有並行運行查詢來擺脫該問題。

這意味着原始異常消息可能是錯誤的(不能排除Damien_The_Unbeliever的答案中提到的某些奇怪路徑)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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