text: c# — Mit diesem Befehl ist bereits ein offener DataReader verbunden, der zuerst geschlossen werden muss
  /Mit diesem Befehl ist bereits ein offener DataReader verbunden, der zuerst geschlossen werden muss
  Ich habe diese Abfrage und ich bekomme den Fehler in dieser Funktion:
  Mit diesem Befehl ist bereits ein offener DataReader verbunden, der zuerst geschlossen werden muss.
  stack-Trace hinzugefügt:
  c#entity-frameworkentity-framework-4
  19.05.2011 DotnetSparrow
  Dies kann vorkommen, wenn Sie eine Abfrage ausführen, während Sie die Ergebnisse einer anderen Abfrage durchlaufen. Aus Ihrem Beispiel ist nicht klar, wo dies geschieht, weil das Beispiel nicht vollständig ist.
  Eine Sache, die dazu führen kann, ist das langsame Laden, das ausgelöst wird, wenn die Ergebnisse einer Abfrage durchlaufen werden.
  Dies kann leicht gelöst werden, indem Sie MARS in Ihrer Verbindungszeichenfolge zulassen. Fügen Sie dem Providerteil Ihrer Verbindungszeichenfolge MultipleActiveResultSets=true hinzu (wobei Datenquelle, Anfangskatalog usw. angegeben sind).
  Sie können die ToList()-Methode vor der return-Anweisung verwenden.
  14.01.2013 kazem
  verwenden Sie die Syntax .ToList(), um das aus db gelesene Objekt in eine Liste umzuwandeln, um ein erneutes Lesen zu vermeiden. Vielen Dank.
  15.03.2017 Icemark Muturi
  Hier ist eine funktionierende Verbindungszeichenfolge für jemanden, der einen Verweis benötigt.
  17.07.2015 Yang Zhang
  In meinem Fall konnte der Fehler mithilfe von Include() behoben werden. Je nach Situation kann es wesentlich effizienter sein, mehrere Abfragen auszugeben, wenn alle gleichzeitig mit einem Join abgerufen werden können.
  15.04.2013 Despertar
  Ich weiß nicht, ob dies eine doppelte Antwort ist oder nicht. Wenn es mir leid tut. Ich möchte nur den Bedürftigen mitteilen, wie ich mein Problem mit ToList () gelöst habe.
  In meinem Fall bekam ich die gleiche Ausnahme für die unten stehende Abfrage.
  Ich löste mich wie folgt
  25.08.2014 Ziggler
  Es scheint, dass Sie DateLastUpdated innerhalb einer aktiven Abfrage mit demselben EF-Kontext aufrufen, und DateLastUpdate gibt einen Befehl an den Datenspeicher selbst aus. Entity Framework unterstützt jeweils nur einen aktiven Befehl pro Kontext.
  Sie können Ihre zwei oben genannten Abfragen folgendermaßen umwandeln:
  Ich habe auch bemerkt, dass Sie in den Abfragen Funktionen wie FormattedAccountNumber und FormattedRecordNumber aufrufen. Wenn diese nicht als gespeicherte Prozeduren oder Funktionen gespeichert sind, die Sie aus Ihrer Datenbank in das Entitätsdatenmodell importiert und korrekt zugeordnet haben, werden auch diese Ausnahmen ausgelöst, da EF die Funktionen nicht in Anweisungen übersetzen kann, die er an den Datenspeicher senden kann.
  Beachten Sie auch, dass das Aufrufen von AsEnumerable die Ausführung der Abfrage nicht erzwingt. Bis die Abfrageausführung verzögert wird, bis sie aufgelistet wird. Sie können die Aufzählung mit ToList oder ToArray erzwingen, wenn Sie dies wünschen.
  19.05.2011 James Alexander
  Zusätzlich zu Ladislav Mrnkas Antwort:
  Wenn Sie Container auf der Registerkarte Settings veröffentlichen und überschreiben, können Sie MultipleActiveResultSet auf True setzen. Sie können diese Option finden, indem Sie auf Erweitert ... klicken und sich in der Gruppe Erweitert befinden.
  17.10.2014 Alexander Troshchenko
  In meinem Fall hatte ich eine Abfrage aus dem Datenkontext geöffnet, z
  ... und dann gleich danach abgefragt ...
  Das Hinzufügen des .ToList zum ersten hat mein Problem behoben. Ich denke, es macht Sinn, dies in eine Eigenschaft wie zu verpacken:
  Dabei ist _stores eine private Variable und Filters ist auch eine Readonly-Eigenschaft, die aus AppSettings liest.
  12.03.2018 Adam Cox
  Ich hatte den gleichen Fehler, als ich versuchte, einige Datensätze innerhalb der Leseschleife zu aktualisieren. Ich habe die am meisten gewählte Antwort MultipleActiveResultSets=true ausprobiert und festgestellt, dass es nur eine Problemumgehung ist, um den nächsten Fehler zu erhalten
  Neue Transaktion ist nicht zulässig, da andere Threads ausgeführt werden in der Sitzung
  Der beste Ansatz für große ResultSets ist die Verwendung von Chunks und das Öffnen eines separaten Kontexts für jeden Chunk, wie in SqlException von Entity Framework beschrieben. Neue Transaktion ist nicht zulässig, da andere Threads in der Sitzung ausgeführt werden.
  02.06.2016 Michael Freidgeim
  Für diejenigen, die dies über Google finden;
  Dieser Fehler wurde angezeigt, da ich, wie durch den Fehler vorgeschlagen, einen SqlDataReader nicht schließen konnte, bevor er einen anderen SqlCommand erstellt, und davon ausging, dass er beim Ablegen der Methode, die er erstellt hat, Müll ist.
  Ich habe das Problem gelöst, indem ich sqlDataReader.Close(); aufgerufen habe, bevor ich den zweiten Reader erstellt habe.
  21.07.2017 timelmer
  Ich habe dieses Problem durch Ändern von Await _accountSessionDataModel.SaveChangesAsync (); In _ accountSessionDataModel.SaveChanges (); In meiner Repository-Klasse gelöst.
  Das Problem war, dass ich die Sitzungen im Frontend nach dem Erstellen einer Sitzung (im Code) aktualisiert habe. Da SaveChangesAsync jedoch asynchron ausgeführt wird, hat das Abrufen der Sitzungen diesen Fehler verursacht, da der Vorgang SaveChangesAsync anscheinend noch nicht bereit war.
  21.07.2017 woutercx
  Dieses Problem tritt höchstwahrscheinlich aufgrund des "Lazy Loading" -Features von Entity Framework auf. Normalerweise werden alle verbundenen Daten (alle Daten, die in anderen Datenbanktabellen gespeichert sind) nur dann abgerufen, wenn dies beim anfänglichen Abruf explizit erforderlich ist. In vielen Fällen ist dies eine gute Sache, da es das Abrufen unnötiger Daten verhindert und somit die Abfrageleistung verbessert (keine Verknüpfungen) und Bandbreite eingespart wird.
  In der in der Frage beschriebenen Situation wird ein erster Abruf durchgeführt, und während der "Auswahl" -Phase werden fehlende Lazy-Loading-Daten angefordert, zusätzliche Abfragen ausgegeben und EF beschwert sich über "Open DataReader".
  Die in der akzeptierten Antwort vorgeschlagene Problemumgehung ermöglicht die Ausführung dieser Abfragen, und tatsächlich wird die gesamte Anforderung erfolgreich sein.
  Wenn Sie jedoch Anforderungen prüfen, die an die Datenbank gesendet werden, werden Sie mehrere Anforderungen feststellen - zusätzliche Anforderungen für alle fehlenden (faul geladenen) Daten. Dies könnte ein Performancekiller sein.
  Besser ist es, EF zu sagen, dass er während der ersten Abfrage alle benötigten Lazy-Load-Daten vorab laden muss. Dies kann mit der Include-Anweisung erfolgen:
  Auf diese Weise werden alle erforderlichen Joins ausgeführt und alle benötigten Daten werden als einzelne Abfrage zurückgegeben. Das in der Frage beschriebene Problem wird gelöst.
  31.03.2018 Illidan
  Ich verwende einen Webdienst in meinem Tool, bei dem die gespeicherte Prozedur abgerufen wird. Während eine größere Anzahl von Client-Tools den Web-Service abruft, tritt dieses Problem auf. Ich habe das Problem behoben, indem ich das Synchronized-Attribut für diese Funktion angegeben habe, um die gespeicherte Prozedur abzurufen. jetzt funktioniert es gut, der Fehler ist in meinem Werkzeug nie aufgetaucht.
  Dieses Attribut erlaubt es, jeweils eine Anfrage zu bearbeiten. das löst also das Problem.
  28.12.2015 Pranesh Janarthanan
  In meinem Fall musste ich die MultipleActiveResultSets in der Verbindungszeichenfolge auf True setzen.
  Dann trat ein weiterer Fehler auf (der echte), weil 2 (SQL) -Befehle nicht gleichzeitig über denselben Datenkontext ausgeführt werden konnten! (EF Core, Code zuerst)
  Also bestand die Lösung für mich darin, nach einer anderen asynchronen Befehlsausführung zu suchen und sie in synchron umzuwandeln, da ich nur einen DbContext für beide Befehle hatte.
  05.03.2019 Dr TJ
  Für mich war es mein eigener Fehler. Ich habe versucht, eine INSERT mit SqlCommand.executeReader() auszuführen, wenn ich SqlCommand.ExecuteNonQuery() hätte verwenden sollen. Es wurde geöffnet und nie geschlossen, wodurch der Fehler verursacht wurde. Achten Sie auf dieses Versehen.
  26.07.2017 Andrew Taylor
  Als Randbemerkung ... kann dies auch passieren, wenn ein Problem mit der (internen) Datenzuordnung von SQL-Objekten auftritt.
  Ich habe einen SQL Scalar Function erstellt, der versehentlich eine VARCHAR... zurückgegeben hat, und dann ... eine Spalte in einer VIEW erstellt. Die VIEW wurde korrekt in der DbContext... abgebildet. So Linq nannte es einfach gut. Die Entity erwartete DateTime? und die VIEW gab String zurück.
  Was wirft ODDLY ...
  "Es ist bereits ein offener DataReader mit diesem Befehl verbunden Der muss zuerst geschlossen werden."
  Es war schwer herauszufinden, aber nachdem ich die Rückgabeparameter korrigiert hatte, war alles gut
  23.10.2018 Prisoner ZERO
  Dies wird aus einem realen Szenario extrahiert:
  Code funktioniert gut in einer Stage-Umgebung, in der MultipleActiveResultSets in der Verbindungszeichenfolge festgelegt ist
  In der Produktionsumgebung veröffentlichter Code ohne MultipleActiveResultSets = true
  So viele Seiten/Aufrufe funktionieren, während eine einzelne fehlschlägt
  Bei näherer Betrachtung des Anrufs wird ein unnötiger Anruf an die Datenbankbibliothek gerichtet und muss entfernt werden
  Setzen Sie MultipleActiveResultSets = true in Production und veröffentlichen Sie bereinigten Code. Alles funktioniert gut und effizient
  Zusammenfassend kann gesagt werden, dass der Code, ohne MultipleActiveResultSets zu vergessen, lange Zeit ausgeführt wurde, bevor ein redundanter db-Aufruf entdeckt wurde, der sehr kostspielig sein kann, und ich schlage vor, nicht vollständig auf das Attribut MultipleActiveResultSets, sondern auch auf find out) zu setzen warum der Code es benötigt, wo es fehlgeschlagen ist.