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

我有一个方法(“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.然后,您可以将该连接用于任何其他目的,或关闭连接,它不会影响您的内存中结果集.您可以在代码周围传递结果集,而无需维护开放的数据库连接.

相关文章

原文地址:http://msdn.microsoft.com/en-us/magazine/cc163...
前言 随着近些年微服务的流行,有越来越多的开发者和团队所采...
最近因为比较忙,好久没有写博客了,这篇主要给大家分享一下...
在多核CPU在今天和不久的将来,计算机将拥有更多的内核,Mic...
c语言输入成绩怎么判断等级
字符型数据在内存中的存储形式是什么