加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何从SqlConnection对象中“分离”SqlDataReader?

发布时间:2020-12-15 08:13:50 所属栏目:百科 来源:网络整理
导读:我有一个方法(“GetDataReader,”让我们称之为)返回一个SqlDataReader.它位于Singleton DataFactory类中,用于维护与数据库的持久连接. 这样做的问题是,在返回之后,DataReader仍然“连接”到我的DataFactory中的Connection对象.所以,我必须确保调用GetDataRea
我有一个方法(“GetDataReader,”让我们称之为)返回一个SqlDataReader.它位于Singleton DataFactory类中,用于维护与数据库的持久连接.

这样做的问题是,在返回之后,DataReader仍然“连接”到我的DataFactory中的Connection对象.所以,我必须确保调用GetDataReader的代码然后在返回的DataReader上调用Close(),否则,它将“锁定”Connection:

There is already an open DataReader associated with this Command which must be closed first.

在从GetDataReader发回DataReader之前,如何“分离”DataReader?要么是,要么克隆它并发回克隆?我不想让调用代码总是明确地关闭它.

这里必须有一个最好的做法.

更新:

谢谢各位的意见.最重要的是,我需要失去使用DataReaders并切换到DataTables的习惯.它们更易于管理.

另外,感谢有关连接池的说明.我知道它,但只是没有把两个和两个放在一起,并意识到我正在重新发明轮子.

解决方法

DataReader必须保持与数据库的连接,直到您不再需要它们为止 – 这就是使用DataReader的本质,因此您无法“断开”它们.当你完成数据阅读器时,你应该关闭它(.Close())但是你不能再使用它了.

从.NET 2.0开始,如果您使用的是SQL 2005或更高版本,则可以使用MARS(多个活动结果集),如here所述.这允许您为多个数据读取器使用单个连接,并且只需要更改为你的连接字符串.
但是,SqlDataReaders并不适合以您想要的方式传递代码.

或者(我认为你需要这样做),你可能想要使用一个断开连接的结果集,这是DataSet / DataTables的用武之地.你使用SqlDataAdapter用查询的所有结果填充DataSet / DataTable.然后,您可以将该连接用于任何其他目的,或关闭连接,它不会影响您的内存中结果集.您可以在代码周围传递结果集,而无需维护开放的数据库连接.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读