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