c# - 如何从 SqlConnection 对象中获取 "detach"一个 SqlDataReader?

标签 c# sqldatareader sqlconnection

我有一个返回 SqlDataReader 的方法(“GetDataReader”,我们这样调用它)。它位于 Singleton DataFactory 类中,该类维护与数据库的持久连接。

问题在于,返回后,DataReader 仍然“连接”到我的 DataFactory 中的 Connection 对象。因此,我必须确保调用 GetDataReader 的代码然后在返回的 DataReader 上调用 Close(),否则,它会“锁定”连接:

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

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

这里必须有一个最佳实践。

更新:

感谢大家的意见。最重要的是,我需要改掉使用 DataReaders 的习惯,改用 DataTables。它们更易于管理。

另外,感谢您对连接池的说明。我知道这件事,但没有将两个和两个放在一起并意识到我是在重新发明轮子。

最佳答案

DataReader 必须保持与数据库的连接,直到您不再需要它们 - 这是使用 DataReader 的本质,因此您不能“断开”它们。当您使用完数据读取器后,您应该将其关闭 (.Close()),但之后您将无法再使用它。

从 .NET 2.0 开始,如果您使用的是 SQL 2005 或更高版本,则可以使用 MARS (多个事件结果集)解释为 here .这允许您为多个数据读取器使用单个连接,并且只涉及对连接字符串的更改。 但是,SqlDataReader 并不适合按照您想要的方式传递代码。

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

关于c# - 如何从 SqlConnection 对象中获取 "detach"一个 SqlDataReader?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2087005/

相关文章:

c# - 如何约束泛型类型必须有一个采用特定参数的构造函数?

c# - Datareader 不显示第一行

asp-classic - 连接超时不起作用

c# - 跨多个方法使用 SQLConnection ('using' 关键字是或否)

c# - 如何对超过一定数量的命令参数进行错误检查

c# - 如何使用 List<string>.Sort 按长度对字符串列表进行排序?

c# - 将 SqlDataReader 中的数据放入 HTML 表中

c# - 如何通过SqlConnection获取最后执行的SQL查询?

c# - 循环中的变量

.net - SqlDataReader 性能缓慢