知识库

[转载]调用SqlDataReader.Close方法的一个小陷井

2012-02-06

  前不久在使用SqlDataReader读取记录,读取一半的时候调用SqlDataReader.Close()来关闭读取.结果老是提示操作超时.百思不得其解,如果Open的时候超时还可以理解,Close的时候,关闭不就完了吗?为什么也会超时.

  仔细翻阅了MSDN对Close方法的说明.获得如下信息.

Close 方法填写输出参数的值、返回值和 RecordsAffected,从而增加了关闭用于处理大型或复杂查询的 SqlDataReader 所用的时间。如果返回值和查询影响的记录的数量不重要,则可以在调用 Close 方法前调用关联的 SqlCommand 对象的 Cancel 方法,从而减少关闭 SqlDataReader 所需的时间。

  原来SqlDataReader为了计算RecordsAffected值,在Close的时候会继续读取剩余的记录.刚好我的数据量又非常大,那在Close的超时时间内读那么多的数据当然会超时了.按照上面所说,如果我要放弃读取后面的记录,我应该先调用SqlCommand的Cancel方法.

  其实这样让人感觉怪怪的.按照一般人的理解,DataReader应该是读多少记录,取多少条记录.都要Close了,那一般情况下应该是放弃后面的记录才是.没想到还是会读完.这应该可以算是一个SqlDataReader的陷井了吧.

  后面想想,如果不是这次测试的记录内容比较大,条数比较多,如果不是这次的超时异常,那像我这样的粗心程序员可能就发现不了这个问题了.看来以后还是要细读MSDN.

  转载自:http://www.greatsu.cn/?p=153

版权所有 © 2011 CopyRight 南宁珞德信息技术有限公司 代码:商务部 设计:新1站