PetaPoco已经是一个开放的数据阅读器了.在主机应用中

本文关键字:数据 应用 主机 一个 PetaPoco | 更新日期: 2023-09-27 18:04:53

我第一次使用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. 已经有一个开放的数据读取器与这个命令相关联
  2. 如何使用Petapoco创建DAL

…建议这是对同一数据库/资源的多个请求的问题,但他们的解决方案是每个请求使用一个db连接,只有我不是在一个复杂的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);     
    }
}

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

Update: Just try this…很疯狂,但很有效,谁能给我一个合理的解决方案?

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

PetaPoco已经是一个开放的数据阅读器了.在主机应用中

Query的使用替换为Fetch。这样做的原因是Fetch提前完成工作并返回一个完全填充的集合,而Query在枚举结果集时获取结果。

错误的原因是你正在使用尝试发出另一个DB请求,而获取结果,正如错误状态,你不能这样做,因为连接有一个开放的DataReader。这就是为什么需要预先获取结果。