PetaPoco在控制台应用程序

时间:2016-08-31 15:52:54

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

1 个答案:

答案 0 :(得分:3)

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

错误的原因是您在尝试获取结果时尝试发出另一个数据库请求,正如错误所述,您无法执行此操作,因为连接已打开DataReader。这就是您需要预先获取结果的原因。