3

我收到以下错误消息,我正在使用 petaPOCO。为什么我收到此错误消息以及收到此消息我做错了什么:

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

This is what I have been able to copy for the exception message.

System.InvalidOperationException 被捕获 Message=已经有一个打开的 DataReader 与此命令关联,必须先关闭。Source=System.Data StackTrace:在 System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand 命令) 在 System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String 方法,SqlCommand 命令) 在 System.Data.SqlClient.SqlCommand.ValidateCommand(String方法,布尔异步)在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔 returnStream,字符串方法,DbAsyncResult 结果)在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔 returnStream , 字符串方法)在 System.Data。

4

4 回答 4

10

我知道这是旧的,但我想添加一些可以帮助下一个人搜索这个的东西。如果您使用 Query 方法,则会发生此错误。Query 方法不会将所有内容加载到内存中。如果您需要加载它然后关闭连接,则需要使用 Fetch。

这是来自网站:

查询与获取

Database 类有两种检索记录的方法 Query 和 Fetch。除了 Fetch 返回 POCO 的 List<> 之外,这些几乎相同,而 Query 使用 yield return 来迭代结果而不将整个集合加载到内存中。

希望这对其他人有帮助。

于 2012-03-09T16:25:17.127 回答
4

这是一个很好的解释为什么会引发这个异常:

http://blogs.msdn.com/b/spike/archive/2009/08/20/there-is-already-an-open-datareader-associated-with-this-command-which-must-be-closed-第一解释.aspx

结论如下:

因为 SqlDataReader 保持内存流(结果集)可用,直到您显式关闭 SqlDataReader,如果您尝试在不关闭前一个读取器的情况下创建新读取器,则会出现此异常。

每当您创建 SqlDataReader 时,更改您的代码以使用 using 语句:

SqlCommand cmd = new SqlCommand(sql, con);
using (SqlDataReader rdr = cmd.ExecuteReader())
{
  while (rdr.Read())
  {
    Console.WriteLine("cid: {0}, ctext: {1}", rdr[0].ToString(), rdr[1].ToString());
  }
}

当达到闭包(结束 } )时,使用将自动调用 dispose() (关闭阅读器)。

如果在 petaPOCO 中引发了此异常,那么他们的代码中存在错误,或者您正在以未指定的方式使用代码。

于 2012-03-06T08:34:35.500 回答
4

您的 ORM(或您的 ORM 使用模式)期望底层 ADO.NET 提供程序允许在单个连接上打开多个 DataReader。您似乎使用的 SQL Server Provider 可以做到这一点,但您必须添加MultipleActiveResultSets=True到用于连接数据库的连接字符串。

于 2012-03-06T08:40:09.087 回答
0

如果您的 poco 没有公共或受保护可见性的无参数构造函数,也可能在 PetaPoco 中引发此异常。

于 2012-04-16T18:10:20.650 回答