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

标签 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.

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

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

...建议这是对同一数据库/资源​​的多个请求的问题,但他们的解决方案是每个请求使用一个数据库连接,只是我不在复杂的网络应用程序中,我正在运行 单线程控制台应用程序,我想一个 Web 应用程序需要多个查询和更新,并在一个请求中全部填充(类似于我正在做的,选择,循环结果,在每一行上更新)。

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

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

最佳答案

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

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

关于c# - 控制台应用程序中的 PetaPoco "already an open DataReader",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39254050/

相关文章:

petapoco - 结果列被排除在 PetaPoco 的自动选择语句之外的原因是什么

c# - 我误解了 PetaPoco.IgnoreAttribute 吗?

c# - 需要调用 InsertBulk<T>(IEnumerable<T> pocos) 但 T 仅在运行时知道

orm - 如何使用 petapoco 映射子类/父类?

c# - 调用套接字的ReceiveAsync()调用后,接收到的数据缓冲区始终为空吗?

c# - 应用程序启动后,如何从 web.config 中读取值?

c# - 非泛型类型中的泛型方法

C# 覆盖枚举

c# - 缺少 HttpClient StatusDescription

c# - 使用 PetaPoco 分页映射关系