3

次のエラー メッセージが表示され、petaPOCO を使用しています。このエラー メッセージが表示される理由と、このメッセージが表示される原因は次のとおりです。

{"There is already an open DataReader associated with this Command which must be closed first."}

This is what I have been able to copy for the exception message.

System.InvalidOperationException がキャッチされました。メッセージ = このコマンドに関連付けられた開いている DataReader が既に存在します。これを最初に閉じる必要があります。ソース = System.Data StackTrace: System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute (SqlCommand コマンド) で System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute (String メソッド、SqlCommand コマンド) で System.Data.SqlClient.SqlCommand.ValidateCommand (String) System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) で System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream 、文字列メソッド) System.Data で。

4

4 に答える 4

10

これが古いことは承知していますが、次の人がこれを検索するのに役立つ何かを追加したかったのです。このエラーは、Query メソッドを使用すると発生します。Query メソッドは、すべてをメモリにロードするわけではありません。ロードしてから接続を閉じる必要がある場合は、Fetch を使用する必要があります。

これはウェブサイトからのものです:

クエリとフェッチ

Database クラスには、レコードを取得するための Query と Fetch の 2 つのメソッドがあります。Fetch が POCO の List<> を返すことを除いて、これらはほとんど同じですが、Query は yield return を使用して、セット全体をメモリにロードせずに結果を反復処理します。

これが他の誰かに役立つことを願っています。

于 2012-03-09T16:25:17.127 に答える
4

ORM(またはORMの使用パターン)は、基盤となるADO.NETプロバイダーが単一の接続で複数の開いているDataReaderを許可することを期待しています。使用していると思われるSQLServerプロバイダーでもそれを実行できますがMultipleActiveResultSets=True、データベースへの接続に使用する接続文字列に追加する必要があります。

于 2012-03-06T08:40:09.087 に答える
4

この例外が発生する理由の優れた説明を次に示します。

http://blogs.msdn.com/b/spike/archive/2009/08/20/there-is-already-an-open-datareader-associated-with-this-command-which-must-be-closed-最初に説明した.aspx

結論は次のとおりです。

SqlDataReader は、SqlDataReader を明示的に閉じるまでメモリ ストリーム (結果セット) を利用可能な状態に保つため、前のリーダーを閉じずに新しいリーダーを作成しようとすると、この例外が発生する可能性があります。

SqlDataReader を作成するたびに using ステートメントを持つようにコードを変更します。

SqlCommand cmd = new SqlCommand(sql, con);
using (SqlDataReader rdr = cmd.ExecuteReader())
{
  while (rdr.Read())
  {
    Console.WriteLine("cid: {0}, ctext: {1}", rdr[0].ToString(), rdr[1].ToString());
  }
}

Using は、クロージャー (終了 } ) に達すると、自動的に dispose() (リーダーを閉じます) を呼び出します。

この例外が petaPOCO で発生した場合は、コードにバグがあるか、コードを不特定の方法で使用しています。

于 2012-03-06T08:34:35.500 に答える
0

この例外は、poco にパブリックまたは保護された可視性のパラメーターなしのコンストラクターがない場合にも、PetaPoco でスローされる可能性があります。

于 2012-04-16T18:10:20.650 に答える