@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

OleDbDataReaderで2つの

1
投稿者投稿内容
よねちん
ベテラン
会議室デビュー日: 2002/09/18
投稿数: 55
投稿日時: 2002-11-05 12:31
.NETのOleDbDataReaderについて
データベースからデータを取得するのにOleDbDataReaderを
使用し以下のようにして記述しています。

Public Const gstrCon = "Provider=SQLOLEDB;" & _
"Server=aaa;" & _
"UID=sa;" & _
"Database=aadb;"
Public dbConn As OleDbConnection
dbConn = New OleDbConnection(gstrCon)
dbConn.Open()

Dim dbCmd As OleDbCommand
Dim auReader As OleDbDataReader
Dim sqlText As String
dbCmd = dbConn.CreateCommand()
sqlText = "SELECT * FROM JST101"
sqlText = sqlText & " WHERE TOKUCD ='" & Trim(txtTOKUCD.Text) & "'"
dbCmd.CommandText = sqlText
auReader = dbCmd.ExecuteReader()
If auReader.Read() Then
txtTOKUCD.Text = auReader("TOKUCD")
txtTOKUNM.Text = auReader("TOKUNM")
     @ここ
Dim dbCmd2 As OleDbCommand
Dim auReader2 As OleDbDataReader
dbCmd2 = dbConn.CreateCommand()
sqlText = "SELECT * FROM JST102"
sqlText = sqlText & " WHERE TOKUCD ='" & auReader("TOKUCD") & "'"
dbCmd2.CommandText = sqlText
auReader2 = dbCmd.ExecuteReader()
If auReader2.Read() Then
処理・・・・・・・・・・・・・・・
End If
End If
auReader.Close()

そこでもう1つのReaderを@のところで使用したいのですが
1つのコネクションでは以下のメッセージがでて使用できませんでした。

「この接続に関連付けられている DataReader が既に開いています。この DataReader を最初に閉じる必要があります。」

この場合にはもう1つコネクションを生成するか、最初のReaderを閉じなければ
読み込みできないのでしょうか?

このようなDBを入れ子で読む場合にはどのようなロジックが最適なのでしょうか?
教えてください
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2002-11-05 13:14
こんにちは。

 やっていることがよく見えないのですが・・・

テーブルJST101
TOKUCD
TOKUNM

テーブルJST102
TOKUCD

とあって、JST101.TOKUCDとJST102.TOKUCDは関係しているんですね?それなら、ただ単に、

SELECT (「JST101.」と修飾した、JST101の列), (「JST102.」と修飾した、JST102の列)
FROM JST101, JST102
WHERE JST101.TOKUCD = JST102.TOKUCD
AND (その他の条件)

でいいのでは?
よねちん
ベテラン
会議室デビュー日: 2002/09/18
投稿数: 55
投稿日時: 2002-11-05 13:46
すみません。それは例です(^^;

2つのリーダを1つのコネクションで使いたかったのです。
調べていたら

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpcontheadonetdatareader.asp
やっぱりReaderは1つのコネクションでは複数作れないことがわかりました。

単にSQLを結合して書けばいいのですが、お化けみたいなSqlになってしまうので
なにか良い方法があったらと思いまして投稿しました。

もし読み込みながら他のデータを読み込みしたい場合にはもう1つコネクションを
生成しようかと思います。
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2002-11-06 05:00
引用:

やっぱりReaderは1つのコネクションでは複数作れないことがわかりました。



sqlText = "SELECT * FROM JST101"
sqlText &= " WHERE TOKUCD ='" & Trim(txtTOKUCD.Text) & "';"
sqlText &= "SELECT * FROM JST102"
sqlText &= " WHERE TOKUCD ='" & auReader("TOKUCD") & "'"
のように2個のSELECTを同時に実行させて複数のDataReaderを生成します。
2番目のDataReaderは、NextResultメソッドで取得します。

myReader.NextResult()

Happy Programming!
Akio Kasai
1

スキルアップ/キャリアアップ(JOB@IT)