Sudah ada aplikasi yang terbuka Hexadecimal yang terkait dengan Perintah ini yang harus ditutup dulu

Saya memiliki query ini dan saya mendapatkan kesalahan dalam fungsi ini:

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);

public DateTime DateLastUpdated(long creditorRegistryId, string accountNo)
{
    return (from h in context.AccountHistory
            where h.CreditorRegistryId == creditorRegistryId && h.AccountNo == accountNo
            select h.LastUpdated).Max();
}

Kesalahan adalah:

Ada yang sudah terbuka Hexadecimal yang terkait dengan Perintah ini yang harus ditutup terlebih dahulu.

Update:

jejak stack menambahkan:

InvalidOperationException: There is already an open DataReader associated with this Command which must be closed first.]
   System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand command) +5008639
   System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String method, SqlCommand command) +23
   System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async) +144
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +87
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +32
   System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +141
   System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +12
   System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) +10
   System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) +443

[EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details.]
   System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) +479
   System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute(ObjectContext context, ObjectParameterCollection parameterValues) +683
   System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) +119
   System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() +38
   System.Linq.Enumerable.Single(IEnumerable`1 source) +114
   System.Data.Objects.ELinq.ObjectQueryProvider.<GetElementFunction>b__3(IEnumerable`1 sequence) +4
   System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle(IEnumerable`1 query, Expression queryRoot) +29
   System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute(Expression expression) +91
   System.Data.Entity.Internal.Linq.DbQueryProvider.Execute(Expression expression) +69
   System.Linq.Queryable.Max(IQueryable`1 source) +216
   CreditRegistry.Repositories.CreditRegistryRepository.DateLastUpdated(Int64 creditorRegistryId, String accountNo) in D:\Freelance Work\SuperExpert\CreditRegistry\CreditRegistry\Repositories\CreditRegistryRepository.cs:1497
   CreditRegistry.Repositories.CreditRegistryRepository.<AccountDetails>b__88(AccountsReport account, Int32 index) in D:\Freelance Work\SuperExpert\CreditRegistry\CreditRegistry\Repositories\CreditRegistryRepository.cs:1250
   System.Linq.<SelectIterator>d__7`2.MoveNext() +198
   System.Linq.Buffer`1..ctor(IEnumerable`1 source) +217
   System.Linq.<GetEnumerator>d__0.MoveNext() +96
Larutan

Hal ini dapat terjadi jika anda menjalankan kueri saat iterasi hasil dari query. Tidak jelas dari contoh di mana hal ini terjadi karena contoh yang tidak lengkap.

Satu hal yang dapat menyebabkan hal ini adalah lazy loading dipicu ketika iterasi hasil dari beberapa query.

Ini dapat diselesaikan dengan mudah dengan memungkinkan MARS pada connection string. Tambahkan MultipleActiveResultSets=true untuk penyedia bagian dari rangkaian sambungan (di mana Sumber Data, Awal Katalog, dll. ditentukan).

Komentar (16)

Anda dapat menggunakan Kedaftar() metode sebelum kembali pernyataan.

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).ToList();

 public DateTime DateLastUpdated(long creditorRegistryId, string accountNo)
    {
        var dateReported = (from h in context.AccountHistory
                            where h.CreditorRegistryId == creditorRegistryId && h.AccountNo == accountNo
                            select h.LastUpdated).Max();
        return dateReported;
    }
Komentar (5)

gunakan sintaks .Kedaftar() untuk mengkonversi objek baca dari db ke daftar untuk menghindari re-baca lagi.Berharap ini akan bekerja untuk itu. Terima kasih.

Komentar (0)

Berikut ini adalah string koneksi untuk seseorang yang membutuhkan referensi.



Komentar (2)

Dalam kasus saya, menggunakan Include() soal kesalahan ini dan tergantung pada situasi dapat menjadi jauh lebih efisien kemudian mengeluarkan beberapa pertanyaan ketika itu semua dapat dilihat sekaligus dengan bergabung.

IEnumerable users = db.Users.Include("Projects.Tasks.Messages");

foreach (User user in users)
{
    Console.WriteLine(user.Name);
    foreach (Project project in user.Projects)
    {
        Console.WriteLine("\t"+project.Name);
        foreach (Task task in project.Tasks)
        {
            Console.WriteLine("\t\t" + task.Subject);
            foreach (Message message in task.Messages)
            {
                Console.WriteLine("\t\t\t" + message.Text);
            }
        }
    }
}
Komentar (1)

Saya tidak tahu apakah ini adalah duplikat menjawab atau tidak. Jika hal ini aku minta maaf. Aku hanya ingin membiarkan orang-orang yang membutuhkan tahu bagaimana saya memecahkan masalah saya menggunakan Kedaftar().

Dalam kasus saya, saya punya yang sama kecuali untuk query di bawah ini.

int id = adjustmentContext.InformationRequestOrderLinks.Where(item => item.OrderNumber == irOrderLinkVO.OrderNumber && item.InformationRequestId == irOrderLinkVO.InformationRequestId).Max(item => item.Id);

Aku diselesaikan seperti di bawah ini

List links = adjustmentContext.InformationRequestOrderLinks
.Where(item => item.OrderNumber == irOrderLinkVO.OrderNumber && item.InformationRequestId == irOrderLinkVO.InformationRequestId).ToList();

int id = 0;

if (links.Any())
{
  id = links.Max(x => x.Id);
 }
if (id == 0)
{
//do something here
}
Komentar (0)

Tampaknya bahwa anda're memanggil DateLastUpdated dari dalam aplikasi yang aktif menggunakan query yang sama EF konteks dan DateLastUpdate mengeluarkan perintah untuk data store itu sendiri. Entity Framework hanya mendukung satu perintah aktif per konteks pada suatu waktu.

Anda dapat refactor anda di atas dua pertanyaan menjadi satu seperti ini:

return accounts.AsEnumerable()
        .Select((account, index) => new AccountsReport()
        {
          RecordNumber = FormattedRowNumber(account, index + 1),
          CreditRegistryId = account.CreditRegistryId,
          DateLastUpdated = (
                                                from h in context.AccountHistory 
                                                where h.CreditorRegistryId == creditorRegistryId 
                              && h.AccountNo == accountNo 
                                                select h.LastUpdated).Max(),
          AccountNumber = FormattedAccountNumber(account.AccountType, account.AccountNumber)
        })
        .OrderBy(c=>c.FormattedRecordNumber)
        .ThenByDescending(c => c.StateChangeDate);

Saya juga melihat anda're memanggil fungsi seperti FormattedAccountNumber dan FormattedRecordNumber dalam query. Kecuali ini disimpan procs atau fungsi anda've diimpor dari database anda ke model data entitas dan dipetakan benar, ini juga akan membuang excepts sebagai EF tidak akan tahu bagaimana untuk menerjemahkan fungsi-fungsi dalam pernyataan itu dapat mengirim ke data store.

Perhatikan juga, memanggil AsEnumerable doesn't kekuatan permintaan untuk mengeksekusi. Sampai eksekusi query ditangguhkan sampai dicacah. Anda dapat memaksa pencacahan dengan Kedaftar atau ToArray jika anda inginkan.

Komentar (2)

Selain Ladislav Mrnka's jawaban:

Jika anda adalah penerbitan dan utama kontainer di Pengaturan tab, anda dapat mengatur MultipleActiveResultSet untuk Benar. Anda dapat menemukan opsi ini dengan mengklik Lanjutan... dan's akan berada di bawah Lanjutan kelompok.

Komentar (0)

Dalam kasus saya, saya telah membuka sebuah query dari data konteks, seperti

    Dim stores = DataContext.Stores _
        .Where(Function(d) filter.Contains(d.code)) _

... dan kemudian tanya sama...

    Dim stores = DataContext.Stores _
        .Where(Function(d) filter.Contains(d.code)).ToList

Menambahkan .Kedaftar untuk pertama diselesaikan masalah saya. Saya pikir itu masuk akal untuk membungkus ini di properti seperti:

Public ReadOnly Property Stores As List(Of Store)
    Get
        If _stores Is Nothing Then
            _stores = DataContext.Stores _
                .Where(Function(d) Filters.Contains(d.code)).ToList
        End If
        Return _stores
    End Get
End Property

Di mana _stores adalah variabel pribadi, dan Filter juga readonly property yang berbunyi dari AppSettings.

Komentar (0)

Kemungkinan besar masalah ini terjadi karena "lazy loading" fitur Entity Framework. Biasanya, kecuali secara eksplisit diperlukan selama awal ambil, semua bergabung data (apa-apa yang disimpan dalam tabel database lain) diambil hanya bila diperlukan. Dalam banyak kasus itu adalah hal yang baik, karena mencegah dari pengambilan data yang tidak perlu dan dengan demikian meningkatkan performa query (tidak bergabung) dan menghemat bandwidth.

Dalam situasi yang dijelaskan dalam pertanyaan, awal fetch dilakukan, dan selama "pilih" fase hilang lazy loading data yang diminta, permintaan tambahan yang dikeluarkan dan kemudian EF mengeluh tentang "terbuka Hexadecimal".

Pemecahan masalah yang diusulkan dalam jawaban yang diterima akan memungkinkan eksekusi dari query ini, dan memang seluruh permintaan akan berhasil.

Namun, jika anda akan memeriksa permintaan dikirim ke database, anda akan melihat beberapa permintaan - permintaan tambahan untuk masing-masing hilang (lazy load) data. Ini mungkin kinerja pembunuh.

Pendekatan yang lebih baik adalah untuk memberitahu kepada EF untuk preload semua yang dibutuhkan malas data yang dimuat pada permintaan awal. Hal ini dapat dilakukan dengan menggunakan "Seperti" pernyataan:

using System.Data.Entity;

query = query.Include(a => a.LazyLoadedProperty);

Dengan cara ini, semua yang dibutuhkan bergabung akan dilakukan dan semua data yang dibutuhkan akan dikembalikan sebagai satu query. Masalah yang dijelaskan dalam pertanyaan akan diselesaikan.

Komentar (1)

Saya memecahkan masalah ini dengan mengubah menanti _accountSessionDataModel.SaveChangesAsync(); untuk _accountSessionDataModel.SaveChanges(); di Repositori kelas.

 public async Task CreateSession()
    {
        var session = new Session();

        _accountSessionDataModel.Sessions.Add(session);
        await _accountSessionDataModel.SaveChangesAsync();
     }

Berubah ke:

 public Session CreateSession()
    {
        var session = new Session();

        _accountSessionDataModel.Sessions.Add(session);
        _accountSessionDataModel.SaveChanges();
     }

Masalahnya adalah bahwa saya diperbarui Sesi di frontend setelah membuat sesi (dalam kode), tapi karena SaveChangesAsync terjadi asynchronously, mengambil sesi disebabkan kesalahan ini karena rupanya SaveChangesAsync operasi itu belum siap.

Komentar (0)

Bagi mereka yang menemukan ini via Google; Saya mendapatkan error ini karena, seperti yang disarankan oleh kesalahan, saya gagal untuk menutup SqlDataReader sebelum menciptakan yang lain pada saat yang sama SqlCommand, keliru mengasumsikan bahwa itu akan menjadi sampah yang dikumpulkan ketika meninggalkan metode itu dibuat.

Saya memecahkan masalah ini dengan memanggil sqlDataReader.Close(); sebelum membuat pembaca kedua.

Komentar (0)

Saya memiliki kesalahan yang sama, ketika saya mencoba untuk meng-update beberapa catatan dalam membaca loop. I've mencoba yang paling sebagai jawaban MultipleActiveResultSets=true dan menemukan, bahwa itu's hanya solusi untuk mendapatkan berikutnya kesalahan 

Baru transaksi ini tidak diperbolehkan karena ada thread lain yang berjalan di sesi

Pendekatan yang terbaik, yang akan bekerja untuk besar ResultSets adalah dengan menggunakan potongan-potongan dan terbuka terpisah konteks untuk setiap chunk seperti yang dijelaskan di  https://stackoverflow.com/questions/2113498/sqlexception-from-entity-framework-new-transaction-is-not-allowed-because-ther/37762186#37762186

Komentar (0)

Dalam kasus saya, saya harus mengatur MultipleActiveResultSets untuk Benar dalam string koneksi. Kemudian muncul kesalahan lain (yang sebenarnya) tentang tidak mampu untuk menjalankan 2 (SQL) perintah-perintah pada saat yang sama lebih dari satu data yang sama konteks! (EF Core, Kode pertama) Jadi solusi bagi saya adalah untuk mencari yang lain asynchronous perintah eksekusi dan mengubahnya ke sinkron, karena saya hanya punya satu DbContext untuk kedua perintah.

Saya berharap hal ini membantu anda

Komentar (0)

Nah bagi saya itu adalah saya sendiri bug. Saya mencoba untuk menjalankan sebuah INSERT menggunakan SqlCommand.executeReader() ketika saya seharusnya menggunakan SqlCommand.ExecuteNonQuery(). Itu terbuka dan tidak pernah tertutup, menyebabkan kesalahan. Watch out untuk pengawasan ini.

Komentar (0)

Ini diekstrak dari sebuah skenario dunia nyata:

  • Kode yang bekerja dengan baik di Panggung lingkungan dengan MultipleActiveResultSets diatur dalam connection string
  • Kode yang diterbitkan untuk lingkungan Produksi tanpa MultipleActiveResultSets=true
  • Begitu banyak halaman/panggilan kerja sementara satu pun gagal
  • Melihat lebih dekat pada panggilan, ada tidak perlu memanggil dibuat untuk db dan perlu dihapus
  • Set MultipleActiveResultSets=true di Produksi dan mempublikasikan dibersihkan kode, semuanya bekerja dengan baik dan efisien

Kesimpulannya, tanpa melupakan MultipleActiveResultSets, kode mungkin telah berjalan untuk waktu yang lama sebelum menemukan yang berlebihan db panggilan yang bisa sangat mahal, dan saya sarankan untuk tidak sepenuhnya bergantung pada pengaturan MultipleActiveResultSets atribut, tetapi juga cari tahu mengapa kode membutuhkannya di mana ia gagal.

Komentar (0)

Sebagai catatan samping...ini juga bisa terjadi ketika ada masalah dengan (internal) data pemetaan dari Objek SQL.

Misalnya...

Aku menciptakan SQL Skalar Fungsi yang sengaja kembali VARCHAR...dan kemudian...yang digunakan untuk menghasilkan sebuah kolom dalam MELIHAT. LIHAT itu benar dipetakan dalam DbContext...jadi Linq memanggil itu baik-baik saja. Namun, Badan diharapkan DateTime? dan MELIHAT kembali String.

Yang ANEHNYA melempar...

"sudah Ada Hexadecimal terbuka terkait dengan Perintah ini yang harus ditutup dulu"

Sulit untuk mencari tahu...tapi setelah saya dikoreksi kembali parameter...semua baik-baik

Komentar (0)

Saya menggunakan layanan web di alat saya, di mana layanan tersebut mengambil prosedur yang tersimpan. sementara lebih banyak jumlah klien alat menjemput layanan web, masalah ini muncul. Saya telah tetap dengan menentukan Disinkronkan atribut bagi fungsi menjemput prosedur yang tersimpan. sekarang bekerja dengan baik, kesalahan tidak pernah muncul di alat saya.

 [MethodImpl(MethodImplOptions.Synchronized)]
 public static List MyDBFunction(string parameter1)
  {
  }

Atribut ini memungkinkan untuk memproses satu permintaan pada suatu waktu. jadi, ini memecahkan Masalah.

Komentar (0)