[英]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,但至少是一個解釋。
回顧了SqlCommand
和OleDbCommand
的參考源之后,它們兩者的ExecuteNonQuery
方法實現中都有一些快速路徑,這些路徑將嘗試避免打開數據讀取器,但是它們都有一條較慢的路徑,這將退回到使用數據讀取器的方式(顯然,數據讀取器路徑必須處理所有可能的選項,並且他們不想重復所有這些代碼,並非沒有道理)。
我懷疑您用來連接到mysql的哪個選項1都會有類似的實現。 因此,首先,不必是導致沖突的SELECT
。
該修復程序應該很簡單,並且是很好的一般建議。 不要共享任何數據庫對象。 當然,您的連接字符串有一個來源,但是,通常,如果您需要一個連接對象,請在該處添加new
對象,然后在using
語句中使用它。 命令對象相同。 對於讀者來說,你不會new
起來自己,但你仍然希望using
。
如果不重用數據庫對象,則永遠不會出現此錯誤。 唯一的例外(在我的書中)是,如果您要共享客戶端,則使用客戶端控制的事務(例如TransactionScope
或類似TransactionScope
)。 但是您仍然不需要共享命令對象。 而且,如果事務范圍如此之廣,以至於您丟失了對其執行的所有命令的跟蹤,那么我建議它太大了。
1上次查看時,有幾個IDbConnection
等層次結構的競爭於mysql的特定實現,另外可以使用OleDbCommand
和family。
基於Bradley Grainger的評論(MySqlConnection的線程安全性問題),我可以通過確保沒有並行運行查詢來擺脫該問題。
這意味着原始異常消息可能是錯誤的(不能排除Damien_The_Unbeliever的答案中提到的某些奇怪路徑)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.