Die Timeout-Ausnahme führt zum Schließen von SqlDataReader.

8

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%     
Paulie 12.11.2009, 01:33
quelle

2 Antworten

12

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.

    
Jeff Sternal 12.11.2009, 02:10
quelle
1

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.

    
GuyBehindtheGuy 12.11.2009 02:09
quelle

Tags und Links