> 故障排除“已經有一個打開的dataReader ...”實體框架中的錯誤 這個錯誤,“已經有一個與此命令關聯的開放數據標準器必須首先關閉,”通常在嘗試執行數據庫查詢時會出現,而另一個查詢的結果仍在處理。 讓我們檢查一個常見的方案及其解決方案。
這個問題通常源自嵌套查詢,其中一種方法在較大的查詢迭代中執行數據庫查詢。 例如,考慮
方法:>
DateLastUpdated
<code class="language-csharp">public DateTime DateLastUpdated(long creditorRegistryId, string accountNo) { return (from h in context.AccountHistory where h.CreditorRegistryId == creditorRegistryId && h.AccountNo == accountNo select h.LastUpdated).Max(); }</code>
LastUpdated
<code class="language-csharp">return accounts.AsEnumerable() .Select((account, index) => new AccountsReport() { // ... other properties ... DateLastUpdated = DateLastUpdated(account.CreditRegistryId, account.AccountNumber); // ... other properties ... }) // ... rest of the query ...</code>
Select
DateLastUpdated
1。啟用多個活動結果集(MARS)
最簡單的解決方案通常是在連接字符串中啟用火星。 這允許多個活動數據讀取器同時進行。 修改您的連接字符串以包括
:
>>警告:MultipleActiveResultSets=True
<code class="language-csharp">connectionString = "Data Source=myServerAddress;Initial Catalog=myDatabase;MultipleActiveResultSets=True;";</code>
>更有效,通常優先的方法是急切的加載。 而不是嵌套查詢,而是使用Entity Framework的
方法在單個查詢中獲取所有必需的數據:這個單個查詢檢索
,和Include
>數據,消除了對多個數據讀取器的需求並解決了錯誤。 急切的加載可以通過減少到數據庫的往返來提高性能。 請記住調整
<code class="language-csharp">var accounts = from account in context.Accounts .Include(a => a.AccountHistory) // Eager load AccountHistory .Include(a => a.Gurantors) // Eager load Gurantors select new AccountsReport { // ... other properties ... DateLastUpdated = account.AccountHistory.Max(h => h.LastUpdated), // ... other properties ... };</code>
>
在火星和急切的加載之間進行選擇取決於您應用程序的特定需求和查詢複雜性。 通常建議使用急切的加載以提高性能和更清潔的代碼,但是如果重構查詢不可行,火星可以快速解決。 Accounts
>
以上是為什麼我會在我的C#代碼中獲得'已經有一個打開的dataReader ...”錯誤,我該如何修復?的詳細內容。更多資訊請關注PHP中文網其他相關文章!