首頁 >後端開發 >C++ >為什麼我會在我的C#代碼中獲得'已經有一個打開的dataReader ...”錯誤,我該如何修復?

為什麼我會在我的C#代碼中獲得'已經有一個打開的dataReader ...”錯誤,我該如何修復?

Susan Sarandon
Susan Sarandon原創
2025-01-29 21:51:09949瀏覽

Why Am I Getting the

> 故障排除“已經有一個打開的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

>語句調用的每次迭代,打開一個新的數據讀取器。 在不關閉這些讀者的情況下,隨後的數據庫操作失敗了,導致“打開的dataReader”錯誤。
<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>
存在兩個主要解決方案:

SelectDateLastUpdated 1。啟用多個活動結果集(MARS)

最簡單的解決方案通常是在連接字符串中啟用火星。 這允許多個活動數據讀取器同時進行。 修改您的連接字符串以包括

>

>警告:火星可以引入性能開銷,並不總是理想的解決方案,尤其是在復雜的查詢中。 MultipleActiveResultSets=True

<code class="language-csharp">connectionString = "Data Source=myServerAddress;Initial Catalog=myDatabase;MultipleActiveResultSets=True;";</code>
2。實施急切的加載

>更有效,通常優先的方法是急切的加載。 而不是嵌套查詢,而是使用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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn