执行数据库操作时,出现阅读器关闭时尝试调用 HasRows无效或者阅读器关闭时尝试调用 Read无效的问题,
经查都是因为操作数据库时,数据库连接已关闭造成的。。
究其原因是因为使用了SqlDataReader返回数据库查询的数据。SqlDataReader的数据保存在数据库服务器中,
当数据库连接关闭/断开后自然无法再调用其方法访问数据库内容然后报错。
解决方法分2种思路:
1、数据库查询返回SqlDataReader时,保证数据库连接不断开。因此代码设计中就要避免使用Using去申请数据库连接对象,因在其作用域之外,连接会自动释放。
此思路当访问量过大时,连接池面临暴涨的风险,需要着重考虑探讨;使用完SqlDataReader的方法访问完数据后需要关闭数据集,建议使用**SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection)**来定义,CloseConnection定义“在执行该命令时,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭。”
2、使用DataSet等类型返回数据库查询数据,DataSet对象在一个暂存区(Cache)保留了数据库中查到的数据,将数据保存在本地内存中。此思路当访问数据量过大时又面临对本地内存的极大要求,需要权衡考虑。
本文详细阐述了在执行数据库操作时遇到的SqlDataReader异常,解释了原因并提供了两种解决方案:保持连接打开或使用DataSet缓存数据。同时讨论了这两种方法的优缺点和适用场景。

2012

被折叠的 条评论
为什么被折叠?



