当试图在SqlDataReader上调用Close或Dispose时,我得到一个超时过期的异常.如果你有一个到SQL Server的DbConnection,你可以自己重现它:
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();
如果你调用reader.Close()或reader.Dispose(),它将抛出一个System.Data.SqlClient.SqlException:
ErrorCode:-2146232060(0x80131904)
消息:"超时已到期.在操作完成之前已经过了超时时间,或者服务器没有响应."
cruizer.. 13
这是因为你刚刚打开数据阅读器并且还没有完全迭代它.在尝试关闭尚未完成的数据读取器(以及DbConnection)之前,您需要.Cancel()您的DbCommand对象.当然,通过.Cancel() - 你的DbCommand,我不确定这个,但你可能会遇到其他一些例外.但如果它发生,你应该抓住它.
这是因为你刚刚打开数据阅读器并且还没有完全迭代它.在尝试关闭尚未完成的数据读取器(以及DbConnection)之前,您需要.Cancel()您的DbCommand对象.当然,通过.Cancel() - 你的DbCommand,我不确定这个,但你可能会遇到其他一些例外.但如果它发生,你应该抓住它.