2009年11月13日金曜日

ネストしたSQLコマンドを投げる場合

1個のConnectionで、DataReaderをClose()しないまま、複数のSelectを投げたりすると、
「There is already an open DataReader associated with this Command which must be closed first.」
と怒られたりする時がある。

基本、DataReaderをClose()してから次のデータ(詳細データ)をひっぱたりするが、
どうしても1対多のデータを1行に出したかったりなんだりで、ネストしたいときがある。

そぎゃん時は、データベースへの接続文字列に、以下情報を追加する。
SQL Server 2005以降:MultipleActiveResultSets=True;
PostgresSQL:Preload Reader = true

つまり接続文字列はこんな感じになるんだね。(ex.ぽすぐれ)
「Server=127.0.0.1; Port=5432; Database=hoge; User Id=hoge; Password=hogehoge; Preload Reader=true;」

以下、情報サイト
SQLServer : http://social.msdn.microsoft.com/forums/en-US/adodotnetdataproviders/thread/6dc3ba69-089a-4278-97f6-e682619d5980/
PostgresSQL:http://pgfoundry.org/forum/forum.php?thread_id=2274&forum_id=518