204  
查询码:00000187
“There is already an open DataReader associated with this Connection which must be closed”解决方案
作者: 陈一奇 于 2020年06月23日 发布在分类 / 人防组 / 人防后端 下,并于 2020年06月23日 编辑

昨天在写一个修改的接口的时候遇到的这个问题,我需要先修改其中一张表,查出对应的几张表的数据先删除再新增,于是就报了这个错误"T here is already an open DataReader associated with this Connection which must be closed first".即已有打开的与此命令相关联的DataReader,必须首先将它关闭。


1、主要原因是 DataReader 在打开使用时,一个 SqlConnection 只允许打开一个 DataReader, 执行SqlDataReader.Read之后,如果还想用另一个SqlCommand执行Insert或者Update操作的话, 会得到这个错误提示,所以在开启另一个 DataReader 时,必须将前面一个先 Close 掉。

2、在使用数据库更新或插入语句时,大家通常使用 SqlCommand 的 ExecuteNonQuery() 方法,并且前提是定义了一个公共的数据库连接(如果每次查询时都生成新连接的话不会存在这个问题,但那样数据库占用的资源相对会高很多),在ExecuteNonQuery() 后,内部会生成一个空的 DataReader 对象,并当当前的数据库连接关闭掉后,该 DataReader 才会释放。因此在大家使用更新方法时,推荐使用 using 关键字,它作为语句,可以将它所定义范围内的对象都释放掉。


解决办法

在ConnectionString中加上一个参数“MultipleActiveResultSets”, 将其值设置为true。

 

MultipleActiveResultSets可以使数据库连接复用。这样就不怕数据库的连接资源被耗尽了。使用方法很简单,只需要把它加到数据的连接字符串中即可。

例如:server=XXXIntegrated Security = true;database=AdventureWorks;MultipleActiveResultSets=true;



 推荐知识

 历史版本

修改日期 修改人 备注
2020-06-23 14:07:40[当前版本] 陈一奇 创建版本

  目录
    知识分享平台 -V 4.8.7 -wcp