SqlDataAdapter中Fill方法的分析

SqlDataAdapter与DataReader冲突解析
本文探讨了在使用SqlCommand的ExecuteReader方法后未关闭DataReader,再次使用SqlDataAdapter填充DataSet时引发InvalidOperationException异常的原因。分析指出,SqlDataAdapter在执行Fill方法时会调用SqlCommand的ExecuteReader方法,若先前产生的DataReader未被关闭,则会导致冲突。
部署运行你感兴趣的模型镜像

作者:山东人在成都

    今天在测试一个数据库连接时,发现当使用SqlCommand的ExecuteReader方法打开一个DataReader后,如果没有关闭,再使用SqlDataAdapter类的Fill方法填充一个DataSet,这时就会发生一个错误,产生一个InvalidOperationException异常,表明已有打开的与此相关联的DataReader,必须首先将它关闭.
    从出错的记录来看,SqlDataAdapter的Fill方法调用了IDbCommand接口的ExecuteReader方法,而该方法的实现是SqlCommand的ExecuteReader,所以Fill方法实际上仍然是调用了SqlCommand的ExecuteReader方法.而ExecuteReader方法将会产生一个DataReader对象,前面已经产生了一个,并且没有关闭,因此出现冲突而产生没有关闭DataReader的错误.
    在MSDN中,与此有关的信息表明:Fill 使用关联的 SelectCommand 属性所指定的 SELECT 语句从数据源中检索行.与 SELECT 语句关联的连接对象必须有效.而在将 SelectCommand 分配给以前创建的 IDbCommand 时,不克隆 IDbCommand.因此SqlDataAdapter类在调用IDbCommand接口的ExecuteReader时会在内部产生一个DataReader.
    在设计模式中,有一个适配器模式,推测在.NET中SqlDataAdapter类也应该是使用了该设计模式.
    需要记住的就是:SqlDataAdapter虽然继承于System.Data.Common.DbDataAdapter,但是在执行Fill方法时,仍然会调用SqlCommand的ExecuteReader方法来读取数据,也仍然会产生一个DataReader.

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值