2016-08-31 75 views
1

我使用PetaPoco首次,並收到此錯誤:PetaPoco「已經是公開的DataReader」在控制檯應用程序

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

...表明這是一個問題的Wi th多個請求到相同的數據庫/資源​​,但他們的解決方案是每個請求使用一個數據庫連接,只有我不是在一個複雜的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對象嗎?這並不意味着answer提出的解決方案,它表明1請求意味着1連接,連接共享,這是一個單線程控制檯應用程序,它不是已經共享任何東西。

更新:只是嘗試這樣做......瘋狂,但它的作品,有人給我一個健全的解決方案,請

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

您可以關閉每個操作的連接,或打開一次連接並將其用於所有操作。 – Reddy

+0

@Reddy我剛剛更新了我的問題,使其工作的代碼,但我不相信這是需要這種解決方案,以使其工作 – Nnoel

+0

@Reddy,實際上「打開一個連接一次」正是我所做的,新的代碼段每次更新都會調用「新」,它的工作原理 – Nnoel

回答

3

互換Query使用情況,以Fetch。原因是因爲Fetch預先完成了工作並返回完全填充的集合,而Query在枚舉結果集時獲取結果。

錯誤的原因是,您正在使用嘗試在獲取結果時發出另一個數據庫請求,這是因爲連接有一個打開的DataReader,這是錯誤狀態。這就是爲什麼您需要預先獲取結果的原因。

+0

謝謝,這是正確的答案,解決了我的問題。 – Nnoel

相關問題