无法弄清楚异常消息

时间:2012-03-01 06:32:11

标签: c# .net petapoco

我有以下错误消息,我正在使用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命令)          在System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String方法,SqlCommand命令)          在System.Data.SqlClient.SqlCommand.ValidateCommand(String方法,布尔异步)          在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行     InnerException:

4 个答案:

答案 0 :(得分:10)

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

这是来自网站:

  

查询与提取

     

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

希望这有助于其他人。

答案 1 :(得分: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-first-explained.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中出现此异常,则代码中存在错误,或者您以未指定的方式使用代码。

答案 2 :(得分:4)

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

答案 3 :(得分:0)

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