我使用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.
根據給出的以下問題和答案...
...表明這是一個問題的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);
您可以關閉每個操作的連接,或打開一次連接並將其用於所有操作。 – Reddy
@Reddy我剛剛更新了我的問題,使其工作的代碼,但我不相信這是需要這種解決方案,以使其工作 – Nnoel
@Reddy,實際上「打開一個連接一次」正是我所做的,新的代碼段每次更新都會調用「新」,它的工作原理 – Nnoel