找不出异常信息

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异常 消息=已经有一个与此命令相关联的打开的DataReader,必须先关闭它。 来源=System.Data 堆栈跟踪: 在System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand command) 在System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String method, SqlCommand command) 在System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async) 在System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) 在System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) 在System.Data.SqlClient.SqlCommand.ExecuteScalar() 在PetaPoco.Database.Insert(String tableName, String primaryKeyName, Boolean autoIncrement, Object poco) 中。C:\Dev\Code\API\Models\PetaPoco.cs:第1243行 内部异常:

1
展示你的代码,其中使用了DataReader。 - Andy
1
你是否正在使用db.Query方法? - patmortech
请添加一些数据访问逻辑代码。 - Shoaib Shaikh
4个回答

10
我知道这篇内容有点老,但我想要补充一些可能会对下一个搜索此问题的人有所帮助的东西。如果您使用Query方法,就会出现这个错误。Query方法不会将所有数据加载到内存中。如果您需要将其加载并关闭连接,需要使用Fetch方法。
以下是来自该网站的内容:
查询与获取
数据库类有两种检索记录的方法:查询(Query)和获取(Fetch)。它们基本上是相同的,只是获取返回POCO的List<>,而查询则使用yield return迭代结果,而不会将整个集合加载到内存中。
希望这能帮助其他人。

谢谢你的提示。使用新的PetaPOCO,答案部分正确。我认为现在Fetch也会调用Query。更好的解决方法是调用ToList()或类似的方法,以获取完整的数据集并关闭读取器。 - Chandermani

4
以下是优秀解释此异常产生原因的内容:
由于SqlDataReader在您明确关闭之前会一直保留内存流(结果集),所以如果您尝试创建新的读取器而未关闭之前的读取器,则可能会出现此异常。
请修改代码,在每次创建SqlDataReader时都加上using语句以确保及时关闭。
链接:http://blogs.msdn.com/b/spike/archive/2009/08/20/there-is-already-an-open-datareader-associated-with-this-command-which-must-be-closed-first-explained.aspx
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中引发此异常,则说明其代码存在错误或您正在以未指定的方式使用该代码。


4

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


0

如果您的poco没有公共或受保护的无参构造函数,PetaPoco也会抛出此异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接