2016-08-31 12 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であることを示唆しています複数のリクエストを同じデータベース/リソースに割り当てることができますが、その解決策はリクエストごとに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); 
+0

操作ごとに接続を閉じるか、接続を一度開いてすべての操作に使用できます。 – Reddy

+0

@Reddy私はちょうどそれを動作させるコードで私の質問を更新しましたが、それはこの動作を得るために必要な解決策の一種であると信じていません。 – Nnoel

+0

@Reddy、実際には「一度接続を開く」は、 – Nnoel

答えて

3

スワップFetchQueryの使用。これは、Fetchが処理を行い、完全に取り込まれたコレクションを返しますが、Queryは結果セットを列挙するときに結果を取得するためです。

エラーの原因は、接続がオープンDataReaderであるため、エラー状態として実行できない結果をフェッチしている間に別のDB要求を発行しようとしていることです。このため、結果を前もって取得する必要があります。

+0

あなたがありがとう、これは正しい答えは、私の問題を修正ありがとう、新しいスニペットは、各アップデートのために '新しい'を呼び出します。 – Nnoel

関連する問題