私が初めて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であることを示唆しています複数のリクエストを同じデータベース/リソースに割り当てることができますが、その解決策はリクエストごとに1つのdb接続を使用することです。複雑なwebappではなく、シングルスレッドコンソールアプリケーションを実行しています。いくつかのクエリと更新が必要で、1回のリクエストですべてを処理する必要があります(私がやっているのと同じように、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