Ich versuche, einige Binärdaten aus einer Datenbank zu ziehen und sie in PDF-Dateien zu schreiben. In den meisten Fällen läuft dies gut, aber die gelegentliche Datenreihe scheint einen besonderen Fehler zu verursachen -
Zeitlimit abgelaufen Das Zeitlimit ist vor dem Abschluss des Vorgangs abgelaufen oder der Server reagiert nicht.
Beachten Sie, dass dies nur bei einer Handvoll Zeilen geschieht und niemals zufällig ist. Die gleichen Zeilen werfen immer die Ausnahme. Ich bin nicht wirklich sicher, warum die Ausnahme ausgelöst wird, aber ich bin in Ordnung mit dem Überspringen der Zeilen, die Probleme verursachen und weitermachen. Mein Problem ist jedoch, dass ich, wenn ich die Ausnahme abfange und dann versuche, in die nächste Zeile zu wechseln, auf eine weitere Ausnahme stoße -
InvalidOperationException - Ungültiger Versuch, Read aufzurufen, wenn der Reader geschlossen ist.
Bedeutet dies, dass der Leser automatisch schließt, sobald eine Ausnahme auftritt? Wie würde ich ohne Dramen in die nächste Reihe gehen?
%Vor%Stapelverfolgung, wie angefordert -
%Vor% Es sieht so aus, als würde Ihr SqlCommand
das Zeitlimit überschreiten. Wenn Sie ExecuteReader
aufrufen, bleibt der zugehörige Befehl offen und ist anfällig für Zeitüberschreitungen, bis Sie mit dem Lesen fertig sind. Wie es in der SqlCommand.CommandTimeout
Dokumentation heißt:
Diese Eigenschaft ist kumulativ Timeout für alle Netzwerklesevorgänge während Befehlsausführung oder Bearbeitung der Ergebnisse. Eine Auszeit kann immer noch auftreten nach der ersten Zeile zurückgegeben wird, und enthält keine Benutzerverarbeitungszeit, Nur Netzwerk Lesezeit.
Wenn der Befehl abläuft, schließt er den Reader, von dem Sie nicht wiederherstellen können.
Als Erstes versuchen Sie, das Problem zu lösen, indem Sie CommandTimeout
drastisch erhöhen, um sicherzustellen, dass Sie fortfahren können.
Wenn Sie dies noch nicht getan haben, kann es hilfreich sein, die ExecuteReader
-Überladung zu verwenden, mit der Sie CommandBehavior
angeben und CommandBehavior.SequentialAccess
übergeben können (gemäß der Empfehlung im MSDN-Thema "Abrufen von großen Daten (ADO.NET) ").
Schließlich können Sie auch versuchen, die Lesevorgänge in Teile von Datensätzen zu zerlegen.
Wenn der SQL-Fehlerschweregrad kleiner als 17 ist, können Sie SqlConnection.FireInfoMessageEventOnUserErrors = true
als Ausnahme für die Ausnahme festlegen. Alles, was größer ist als Schweregrad 17, wird die Verbindung schließen Egal was.
Tags und Links sql c# sqldatareader