昨天在写一个修改的接口的时候遇到的这个问题,我需要先修改其中一张表,查出对应的几张表的数据先删除再新增,于是就报了这个错误"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;