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
Lepaskan: 2025-01-29 21:56:09
asal
381 orang telah melayarinya

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>
Salin selepas log masuk
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>
Salin selepas log masuk
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>
Salin selepas log masuk
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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan