我有以下错误消息,我正在使用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:
答案 0 :(得分:10)
我知道这是旧的,但我想添加一些可能有助于下一个搜索此内容的人。如果使用Query方法,则会发生此错误。 Query方法不会将所有内容加载到内存中。如果您需要加载它然后关闭连接,则需要使用Fetch。
这是来自网站:
查询与提取
Database类有两种方法可以检索记录Query和 取。这些几乎相同,只是Fetch返回List<> POCO的,而Query使用yield return来迭代结果 没有将整个集合加载到内存中。
希望这有助于其他人。
答案 1 :(得分:4)
这是一个很好的解释,为什么会引发这个异常:
结论如下:
因为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中抛出此异常。