11

SqlDataReader別の中に a を実装するにはどうすればよいSqlDataReaderですか?

私の問題は、SqlDataReader. 私は発行while (reader.read())していますが、while ループ内でSqlDataReader、データベースから読み取るために別のループを作成する必要があります。しかし、接続が既に開いているという例外が発生しています。

では、私の問題を解決する最善の方法は何ですか?

編集:

clr を使用してストアド プロシージャを作成しています。MultipleActiveResultSets=true;clr とプロジェクトの両方の接続文字列内に配置しようとしましたが、SQL Server でストアド プロシージャをテストしたときに例外が発生しました。

System.InvalidOperationException: このコマンドに関連付けられている開いている DataReader が既に存在します。これを最初に閉じる必要があります。

4

2 に答える 2

18

ネストされた 2 つのデータ リーダーが必要であり、これには ADO.NET の "MARS" 機能 (複数のアクティブな結果セット) が必要です。

これは ADO.NET 2.0 以降で利用可能MultipleActiveResultSets=true;で、接続文字列に特定の設定 ( ) が必要です。

Server=.\SQLEXPRESS;Database=master;Integrated Security=SSPI;
  MultipleActiveResultSets=true;

優れた議論については、このブログ投稿を参照してください。

これを取得すると、コード内で複数をSqlDataReader共有し、SqlConnectionそれらを互いに独立して使用できるようになります。

更新:このブログ投稿では、MARS 機能は SQL CLR 環境内では使用できないと述べています :-( したがって、SQL CLR ストアド プロシージャ内では動作しません....

于 2010-03-01T12:50:12.057 に答える
6

発生している問題は、同じデータベース接続に対して複数のデータリーダーを開こうとしていることです。これまで見てきたように、デフォルトでは、接続に関連付けられているものがすでに存在することを示すため、これにより例外が発生します。

MultipleActiveResultsetsを利用できます。これにより、.NET2.0およびSQLServer 2005以降では、接続文字列に追加のオプションを指定して、次を追加することにより、単一のデータベース接続に対して複数のアクティブな結果セットを有効にできます。

MultipleActiveResultSets=True;

別の方法は、別の接続を使用して内部データリーダーを開くことです。

あるいは、元のアプローチを再考することも可能かもしれません-ネストされたリーダーなしでそれを行う方法があるかもしれません。

于 2010-03-01T12:51:50.263 に答える