• ベストアンサー

複数SQL発行について

お世話になります。 VB.NET2003とSQLServer2005にて開発を行っております。 Aテーブルからデータを取得してその取得データを元にBテーブルを参照する。 と、言うのがあるのですが、 Bテーブル参照時に「この接続に関連付けられている DataReader が既に開いています。この DataReader を最初に閉じる必要があります。」の エラーとなってしまいます。 複数SQLを発行する場合、再度接続を行わなければならないのでしょうか? 同一接続内で複数のSQLを発行することは出来ないのでしょうか? どなたかご存知でしたらお教え願います。 以下、ソース ' 変数宣言 Dim objDBConnect As SqlConnection Dim objDBTran As SqlTransaction Dim objSqlCmd As SqlCommand Dim objSqlDRA As SqlDataReader Dim objSqlDRB As SqlDataReader ' データベース接続 objDBConnect = New SqlConnection("接続文字列") objDBConnect.Open() ' トランザクション開始 objDBTran = objDBConnect.BeginTransaction(IsolationLevel.ReadCommitted) ' SQL発行 objSqlCmd = New SqlCommand("SELECT * FROM A_TABLE", objDBConnect) objSqlDRA = objSqlCmd.ExecuteReader() While objSqlDRA.Read() objSqlCmd = New SqlCommand("SELECT * FROM B_TABLE", objDBConnect) objSqlDRB = objSqlCmd.ExecuteReader() ←ここで、エラーとなってしまいます。 End While

質問者が選んだベストアンサー

  • ベストアンサー
  • mahny
  • ベストアンサー率74% (57/77)
回答No.2

#1です。 ごめんなさい。1接続に対して1つだけみたいです。 ▼MSDN引用 DataReader の終了 DataReader を使い終えたら、Close メソッドを呼び出す必要があります。 Command に出力パラメータや戻り値が含まれていても、DataReader が終了するまでは使用できません。 DataReader が開いている間、Connection はその DataReader によって排他的に使用されています。元の DataReader が終了するまでは、その Connection に対してはどのコマンドも実行できません。別の DataReader を作成することもできません。

参考URL:
http://msdn2.microsoft.com/ja-jp/library/haa3afyz.aspx
yu1ohni
質問者

お礼

mahny様回答ありがとうございます。 >1接続に対して1つだけみたいです。 という事は、DataReader では出来ないという事ですね。 DataReaderを使用するなら、DataReaderから別な入れ物にコピーして再度、DataReaderにて取得を行う。 の方法でいくしかないでしょうか? また、別な方法がありましたら教えて頂けませんでしょうか?

その他の回答 (4)

回答No.5

説明を読む限りselect文ないで結合させて一つのSQL文にすれば良いだけの 様に思えるのですが

  • qtea
  • ベストアンサー率77% (38/49)
回答No.4

DataReaderは1つの接続に対して、1つしかopenできません。 なので、接続(SqlConnection)を2つ作るか、別な入れ物にコピーして…かのどちらかではないでしょうか。 別な入れ物にコピーする場合は、データセットを使うのがおすすめです。

  • PED02744
  • ベストアンサー率40% (157/390)
回答No.3

素直に、DataAdapter/DataSetは使えないのでしょうか? 手元に例がないので、うろ覚えで書きますが、 Dim conn as Connection Dim sql as String Dim dad1 as DataAdapter Dim dad2 as DataAdapter Dim dSet as DataSet conn = new Connection("Data Source=~~~") sql = "SELECT ~ FROM TBL_A WHERE ~~~" DataAdapter dad1 = new DataAdapter(sql, conn) dad1.Fill(dSet, "TBL_A") sql = "SELECT ~ FROM TBL_B WHERE ~~~" DataAdapter dad2 = new DataAdapter(sql, conn) dad2.Fill(dSet, "TBL_B") こんな感じ

  • mahny
  • ベストアンサー率74% (57/77)
回答No.1

そんなことは無いと思います。 While objSqlDRA.Read() objSqlCmd = New SqlCommand("SELECT * FROM B_TABLE",objDBConnect) objSqlDRB = objSqlCmd.ExecuteReader() '←ここで、エラーとなってしまいます。 End While 手元にVB環境無いので勘で書きますが、 上記ループの2週目でエラーが発生していませんか? だとすれば、1週目のループで objSqlDRB As DataReader が出来上がっているのに そこにさらにDataReaderオブジェクトを重ねようとしたからじゃないですかね。。。