- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个返回 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/
如何在另一个 SqlDataReader 中实现一个 SqlDataReader? 我的问题是我有一个 SqlDataReader。我正在发出 while (reader.read()) 并且在 wh
作为 C# 新手,我在不同线程之间传递 SqlDataReader 时遇到了这个“难题”。无需过多讨论,其想法是让主线程从数据库(大型记录集)中获取数据,然后让辅助任务逐条记录地运行该记录,并根据其内
在命名空间System.Data.SqlClient下,我们都有 SqlDataReader.GetSqlBinary 和 SqlDataReader.GetSqlBytes . 两者似乎都提供了“原
更新:事实证明反射也不一定很慢。使用 Fasterflect (http://www.codeproject.com/Articles/38840/Fasterflect-a-fast-and-sim
一个被认为是更好的标准?一个比另一个快吗?或者,主要是偏好? GetOrdinal 很好,因为您可以自己调用列名,而不必担心在 SQL 中计算字段的索引,但我想知道使用其中一个是否比另一个有好处。 按
这两种方法的主要区别是什么?在 msdn 网站上,它的解释如下,但我不明白。 Read 将 SqlDataReader 前进到下一条记录。 (覆盖DbDataReader.Read().) NextR
我想从数据库中检索十进制值,我想知道检查空值的推荐方法是什么。 我在 MSDN - DBNull.Value Field 上看到过很少使用此检查。 因此,reader.IsDBNull 是检查空值的最
我正在为我的数据访问层编写单元测试。为此,我为 SqlCommand (ISqlCommand) 创建了一个包装器,以便我可以模拟其功能。 ISqlCommand command = _connect
我有一个存储过程,其中包含用于返回记录的 ORDER BY 子句。当我在 SQL 中执行时,我看到适当的顺序。 但是,当我从客户端执行并加载到 SqlDataReader 时,顺序发生了变化。这不是预
从值为 null 的读取器转换日期时间时出现问题。 form._date101 = reader[52] == DBNull.Value ? DBNull.Value : (DateTime?)rea
有谁知道 DbDataReaders 是如何工作的。我们可以以SqlDataReader为例。 当您执行以下操作时 cmd.CommandText = "SELECT * FROM Customers
使用以下语法从SqlDataReader读取值之间有什么区别: Dim reader As SqlClient.SqlDataReader reader("value").ToString() 要么
我在 MSSMS 中执行了约 2 秒的查询(返回 25K 行) .NET (sqlReader) 中使用的相同查询执行几分钟! 我也尝试过只执行阅读器 (注释了 while 循环中的所有代码,只留下
我有一个问题,我列出了 100 多个学生,但读取器只检索到表中的最后一个学生。 string selectQuery = "SELECT * FROM Students WHERE firstName
我的项目是一个 Windows 服务,我在从我的数据库返回值时遇到了问题,所以我将这段代码分离到一个控制台应用程序中以便于调试,但在我的服务中不起作用的代码在控制台应用程序。 所以在我的服务中我有这个
我在数据库记录 1 和记录 2 中有两条记录。datareader 将返回记录 1 的 guid 值,代码工作正常。但在记录 2 上,数据读取器将返回“”。我的问题是如何无一异常(exception)
我有一个使用 SQLLite 的数据库,我正在使用 C#。我进行了查询并且它有效,但是当查询有 ( ) 时它失败并给出了关于 SQL 语法的异常。 我创建了一个函数来帮助我使用 SQLiteDataR
我想用对象填充列表。这些对象包含以下格式的信息: class record { //klassen variable private string voornaam; priv
能否将 SqlDataReader 传递给 session 或发送给客户端? 例如,如果我从数据库中检索了一些行,并想将这些数据发送到另一台客户端机器。我可以通过在服务器上使用 json 序列化它然后
我正在尝试通过引用传递给读者或让读者返回。我在返回时遇到了问题。 public static SqlDataReader GetSql(string businessUnit, string task
我是一名优秀的程序员,十分优秀!