gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:20:32 24 4
gpt4 key购买 nike

我有一个返回 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com