当前位置:  开发笔记 > 数据库 > 正文

.NET:SqlDataReader.Close或.Dispose导致Timeout Expired异常

如何解决《.NET:SqlDataReader.Close或.Dispose导致TimeoutExpired异常》经验,为你挑选了1个好方法。

当试图在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,我不确定这个,但你可能会遇到其他一些例外.但如果它发生,你应该抓住它.



1> cruizer..:

这是因为你刚刚打开数据阅读器并且还没有完全迭代它.在尝试关闭尚未完成的数据读取器(以及DbConnection)之前,您需要.Cancel()您的DbCommand对象.当然,通过.Cancel() - 你的DbCommand,我不确定这个,但你可能会遇到其他一些例外.但如果它发生,你应该抓住它.

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有