2012-03-30 2 views
0

Also, ich bekomme den Fehler nach meiner Titelzeile. Scheint ziemlich selbsterklärend, aber mein Verständnis ist, dass Objekte innerhalb des "using" Blocks entsorgt werden? Dieser Fehler ist aufgetreten, nachdem ein anderer kleiner Fehler die Codeausführung unterbrochen hat. Vielleicht bin ich also mit einem offenen Reader fest, den ich schließen oder herunterfahren muss? Jede Hilfe wäre willkommen?C#/SQL Server-Fehler 'Diesem Befehl ist bereits ein offener DataReader zugeordnet, der zuerst geschlossen werden muss.'

+0

Ist es reproduzierbar oder ist es nur einmal passiert, als Sie debuggten? –

+0

@Bryan Ich habe es bei dem Fehler gestoppt, Rerunning, gleichen Fehler. Ich habe versucht, während cmd.Dispose, ohne Erfolg zu debuggen. – StatsViaCsh

+0

Machst du etwas anderes mit 'this.sqlConnection' woanders, die das beeinflussen könnte? Es klingt wie ein anderes Befehlsobjekt an einem anderen Ort in Ihrem Code, der dieselbe 'SqlConnection' verwenden könnte und noch nicht geschlossen wurde. –

Antwort

1

Ich glaube nicht, dass der Code, den Sie gezeigt haben, die Ursache des Problems ist. Während es üblich ist, SqlCommand (IDbCommand) Objekte zu entsorgen, habe ich es in der Praxis nicht für notwendig erachtet. Was ist notwendig ist, um SqlDataReader (IDataReader) Objekte zu entsorgen, nachdem Sie sie verwendet haben. Suchen Sie in der Fehlermeldung nach einer Verwendung eines SqlDataReader Objekts in Ihrem Code, das nicht entsorgt wird. Die Ausnahme wird möglicherweise aus dem angezeigten Code ausgelöst, aber ich vermute, dass die Ursache darin liegt, dass SqlDataReader demselben SqlConnection zugeordnet ist, der früher in der Programmausführung verwendet wurde und nicht entsorgt wurde.

+0

Du hast Recht. Vielen Dank. Ich fand eine offene Referenz von über 40, von der ich nicht dachte, dass sie angerufen wurde. – StatsViaCsh

1

Ein Problem mit der using-Klausel ist, dass es keine Möglichkeit bietet, Ausnahmen im impliziten try/finally-Block zu verarbeiten, den der Compiler für Sie generiert.

Sie können 1) wickeln Sie Ihre mit einem try/catch mit Klausel oder 2) Code manuell einen try/catch/finally anstelle der Verwendung, den Aufruf von Dispose im finally-Block und das Hinzufügen von Ausnahmebehandlung in einem catch-Block.

Es gibt leichte Nachteile zu jeder Technik, aber entweder funktioniert

+0

Danke für die robustere Implementierungsidee .. – StatsViaCsh

0

Sie können MARS (mehrere aktive Resultsets), um Ihre Verbindungszeichenfolge hinzufügen, mehrere Datensatzgruppe (oder ähnlich) offen zugleich zu ermöglichen.

MultipleActiveResultSets=true; 

oder

MARS Connection=True; 

zu Verbindungszeichenfolge (http://www.connectionstrings.com/sql-server-2008) hinzufügen und diese mehrere Griffe erlauben, aber wenn Die vorherige Operation wurde in einer Ausnahme "unterbrochen". Versuchen Sie, "USING" zu vermeiden oder verwenden Sie einen try/catch.

Verwandte Themen