アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。

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

A 回答 (5件)

#1です。


ごめんなさい。1接続に対して1つだけみたいです。

▼MSDN引用
DataReader の終了
DataReader を使い終えたら、Close メソッドを呼び出す必要があります。

Command に出力パラメータや戻り値が含まれていても、DataReader が終了するまでは使用できません。

DataReader が開いている間、Connection はその DataReader によって排他的に使用されています。元の DataReader が終了するまでは、その Connection に対してはどのコマンドも実行できません。別の DataReader を作成することもできません。

参考URL:http://msdn2.microsoft.com/ja-jp/library/haa3afy …
    • good
    • 0
この回答へのお礼

mahny様回答ありがとうございます。

>1接続に対して1つだけみたいです。
という事は、DataReader では出来ないという事ですね。
DataReaderを使用するなら、DataReaderから別な入れ物にコピーして再度、DataReaderにて取得を行う。 の方法でいくしかないでしょうか?

また、別な方法がありましたら教えて頂けませんでしょうか?

お礼日時:2006/10/26 17:15

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


様に思えるのですが
    • good
    • 0

DataReaderは1つの接続に対して、1つしかopenできません。


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

素直に、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")

こんな感じ
    • good
    • 0

そんなことは無いと思います。



While objSqlDRA.Read()
objSqlCmd = New SqlCommand("SELECT * FROM B_TABLE",objDBConnect)
objSqlDRB = objSqlCmd.ExecuteReader() '←ここで、エラーとなってしまいます。
End While

手元にVB環境無いので勘で書きますが、
上記ループの2週目でエラーが発生していませんか?
だとすれば、1週目のループで objSqlDRB As DataReader が出来上がっているのに
そこにさらにDataReaderオブジェクトを重ねようとしたからじゃないですかね。。。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A