我第一次使用PetaPoco,并收到此错误:
An unhandled exception of type 'System.InvalidOperationException' occurred in Anonymiser.exe. Additional information: There is already an open DataReader associated with this Command which must be closed first.
根据以下问题和答案给出......
...建议这是对同一个数据库/资源的多个请求的问题,但是他们的解决方案是每个请求使用一个数据库连接,只是我不在复杂的webapp中,我正在运行单线程控制台应用程序,我想Web应用程序需要多个查询和更新,并且所有内容都在一个请求中(类似于我正在做的,select, loop results, update on each row
)。
我在下面发布了相关的代码,第一位是使用泛型和反射来基本上调用“Query”来获取表中的所有数据(旨在不知道我希望随机化的数据的数据库结构) ,然后我更改每行中的数据,并在插入随机数据后“更新”每一行,如此......
//select all data in a table
// non-generic version :: db.query<db_table>("select * from db_tableName");
var typedMethod = queryMethodInfo.MakeGenericMethod(t);
var allRows = typedMethod.Invoke(db, new Object[] { "select * from " + tableName, null });
//then loop through the data
foreach (var item in (allRows as IEnumerable))
{
string primaryKey;
if (findPrimaryKey(item, out primaryKey)) // no primary key no update
{
// randomize the data here
DataRandomizer.ProcessObject(item);
// push data back to the database
db.Update(tableName, primaryKey, item);
}
}
每次操作后我应该'关闭'连接吗?我应该为每个sql操作创建一个新的PetaPoco.Database
对象吗?这并不是answer提出的解决方案,它建议1个请求意味着1个连接,共享连接,这是一个单线程控制台应用程序,它没有共享任何东西。
更新:试过这个......疯了,但是有效,请有人给我一个理智的解决方案
(new PetaPoco.Database("DBConnectString")).Update(tableName, primaryKey, item);
答案 0 :(得分:3)
将Query
的使用权转换为Fetch
。这样做的原因是因为Fetch
预先完成工作并返回完全填充的集合,而Query
在枚举结果集时获取结果。
错误的原因是您在尝试获取结果时尝试发出另一个数据库请求,正如错误所述,您无法执行此操作,因为连接已打开DataReader
。这就是您需要预先获取结果的原因。