.NET: SqlDataReader.Schließen oder .Entsorgen Sie die Ergebnisse im Zeitablauf Ausnahme
Wenn Sie versuchen zu nennen Close oder Dispose auf ein SqlDataReader-ich bekomme eine timeout expired-exception. Wenn Sie eine DbConnection zu SQL Server, können Sie reproduzieren sich selbst mit:
String CRLF = "\r\n";
String sql =
"SELECT * " + CRLF +
"FROM (" + CRLF +
" SELECT (a.Number * 256) + b.Number AS Number" + CRLF +
" FROM master..spt_values a," + CRLF +
" master..spt_values b" + CRLF +
" WHERE a.Type = 'p'" + CRLF +
" AND b.Type = 'p') Numbers1" + CRLF +
" FULL OUTER JOIN (" + CRLF +
" SELECT (print("code sample");a.Number * 256) + b.Number AS Number" + CRLF +
" FROM master..spt_values a," + CRLF +
" master..spt_values b" + CRLF +
" WHERE a.Type = 'p'" + CRLF +
" AND b.Type = 'p') Numbers2" + CRLF +
" ON 1=1";
DbCommand cmd = connection.CreateCommand();
cmd.CommandText = sql;
DbDataReader rdr = cmd.ExecuteReader();
rdr.Close();
Wenn Sie call-reader.Close () - oder der Leser.Dispose() wird es werfen ein System.Daten.SqlClient.SqlException:
- ErrorCode: -2146232060 (0x80131904)
- Meldung: "Timeout ist abgelaufen. Das Zeitlimit wurde vor Abschluss des Vorgangs oder der server antwortet nicht."
Du musst angemeldet sein, um einen Kommentar abzugeben.
es ist, weil Sie gerade geöffnet haben, die Daten-reader und noch nicht vollständig Durchlaufen Sie noch. Sie benötigen, um .Cancel() Ihre DbCommand-Objekt, bevor Sie versuchen, schließen Sie ein Daten-Leser, die noch nicht abgeschlossen noch (und die DbConnection als gut). natürlich, durch .Cancel()-ing DbCommand, ich bin mir nicht sicher, aber Sie kann auch einige andere Ausnahme. aber Sie soll nur fangen, wenn es passiert.
Cruizer hatte die Antwort: call-Befehl.Cancel():
Ist es auch hilfreich zu wissen, dass Sie anrufen können Abbrechen, auch wenn der Leser bereits gelesen hat, werden alle Zeilen (d.h. es muss nicht werfen einige "nichts " Abbrechen" Ausnahme.)
Wo man eigentlich die Daten Auslesen? Sie sind nur die Schaffung eines Lesers, aber nicht die Daten zu Lesen. Es ist nur eine Vermutung, aber vielleicht hat der Leser Probleme, zu schließen, wenn Sie nicht Lesen 😉