PetaPoco 在控制台应用程序中“已经是一个开放的 DataReader”

Nin*_*oel 1 c# petapoco

我第一次使用 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.
Run Code Online (Sandbox Code Playgroud)

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

  1. 已经有一个与此命令关联的打开的 DataReader
  2. 如何使用 Petapoco 创建 DAL

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

我已经在下面发布了相关代码,第一位是使用泛型和反射基本上调用“查询”来从表中获取所有数据(旨在不知道我希望随机化的数据的数据库结构),然后我插入随机数据后更改每一行中的数据并“更新”每一行,就像这样......

//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);     
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

(new PetaPoco.Database("DBConnectString")).Update(tableName, primaryKey, item);
Run Code Online (Sandbox Code Playgroud)

Ple*_*ori 5

交换Queryto的用法Fetch。这样做的原因是因为Fetch预先进行工作并返回一个完全填充的集合,而Query在枚举结果集时获取结果。

错误的原因是您正在尝试在获取结果时发出另一个数据库请求,正如错误所述,您不能这样做,因为连接有一个 open DataReader。这就是为什么您需要预先获取结果。