控制台应用程序中的 PetaPoco "already an open DataReader"

PetaPoco "already an open DataReader" in console app

我是第一次使用 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.

根据以下问题及给出的答案...

  1. There is already an open DataReader associated with this Command
  2. How to create a DAL using Petapoco

...建议这是对同一 database/resource 的多个请求的问题,但他们的解决方案是每个请求使用一个数据库连接,只是我不在复杂的 webapp 中,我是运行 一个 单线程控制台应用程序 ,我想一个 Web 应用程序将需要多个查询和更新以及一个请求中的所有东西(类似于我正在做的,select, loop results, update on each row).

我已经在下面发布了相关代码,第一部分是使用泛型和反射来基本上调用 "Query" 以从 table 中获取所有数据(设计为不知道数据库结构我希望随机化的数据),然后在插入随机数据后更改每一行和 "Update" 每行的数据,就像这样...

//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);     
    }
}

每次操作后都应该'close'连接吗?我应该为每个 sql 操作创建一个新的 PetaPoco.Database 对象吗?这并不是 answer 提出的解决方案,它建议 1 个请求意味着 1 个连接,共享连接,这是一个单线程控制台应用程序,尚未共享任何内容。

更新: 刚试过这个...疯狂,但它有效,请有人给我一个理智的解决方案

(new PetaPoco.Database("DBConnectString")).Update(tableName, primaryKey, item);

Query 的用法替换为 Fetch。这样做的原因是因为 Fetch 预先完成工作,returns 是一个完全填充的集合,而 Query 在您枚举结果集时获取结果。

错误的原因是您在获取结果时试图发出另一个数据库请求,正如错误状态,您不能这样做,因为连接有一个打开的 DataReader。这就是您需要预先获取结果的原因。