Rumah >pembangunan bahagian belakang >C++ >Kenapa rangka kerja entiti membuang 'Sudah ada datareader terbuka yang berkaitan dengan arahan ini yang mesti ditutup terlebih dahulu'?

Kenapa rangka kerja entiti membuang 'Sudah ada datareader terbuka yang berkaitan dengan arahan ini yang mesti ditutup terlebih dahulu'?

DDD
DDDasal
2025-01-29 21:56:09382semak imbas

Why Does Entity Framework Throw

Ralat "Open DataReader" Rangka Kerja: Perangkap biasa

Rangka kerja entiti moden memudahkan interaksi pangkalan data, tetapi ralat "sudah ada datareader terbuka yang berkaitan dengan perintah ini yang mesti ditutup terlebih dahulu" tetap menjadi sakit kepala yang kerap. Artikel ini menerangkan punca akar dan menyediakan penyelesaian.

Pertimbangkan senario ini: pertanyaan mengambil data akaun, kemudian melakukan pemprosesan selanjutnya:

<code class="language-csharp">var accounts = from account in context.Accounts
               from guranteer in account.Gurantors
               select new AccountsReport
               {
                   CreditRegistryId = account.CreditRegistryId,
                   AccountNumber = account.AccountNo,
                   DateOpened = account.DateOpened,
               };

return accounts.AsEnumerable()
                .Select((account, index) => new AccountsReport()
                    {
                        RecordNumber = FormattedRowNumber(account, index + 1),
                        CreditRegistryId = account.CreditRegistryId,
                        DateLastUpdated = DateLastUpdated(account.CreditRegistryId, account.AccountNumber),
                        AccountNumber = FormattedAccountNumber(account.AccountType, account.AccountNumber)
                    })
                .OrderBy(c=>c.FormattedRecordNumber)
                .ThenByDescending(c => c.StateChangeDate);</code>
kaedah

, ditunjukkan di bawah, menambah pertanyaan pangkalan data lain: 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>
Masalahnya? Pertanyaan utama membuka

. DataReader membuka lagi DateLastUpdated tanpa menutup yang pertama, yang membawa kepada kesilapan.

Penyelesaian: Set hasil aktif berganda (MARS)

Pembetulan paling mudah adalah untuk membolehkan pelbagai set hasil aktif (MARS) dalam rentetan sambungan anda:

<code class="language-csharp">Data Source=myServer;Initial Catalog=myDatabase;MultipleActiveResultSets=true</code>
Mars membolehkan pangkalan data mengendalikan beberapa kursor terbuka secara serentak, menghalang konflik dan menyelesaikan ralat "terbuka datareader". Ini mengelakkan keperluan untuk penutupan

manual, memudahkan kod anda. DataReader

Atas ialah kandungan terperinci Kenapa rangka kerja entiti membuang 'Sudah ada datareader terbuka yang berkaitan dengan arahan ini yang mesti ditutup terlebih dahulu'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn