- PR -

ExecuteReaderについて

1
投稿者投稿内容
いっく☆
常連さん
会議室デビュー日: 2003/11/26
投稿数: 35
投稿日時: 2003-12-17 18:08
こんにちは。VB.NET2003 SQL文作成の中でExecuteReaderを使用して,SELECT文よりある値を
取得し,そのループ文の中で取得したを利用して別のSELECT文を作成したいのですが,
ExecuteReaderを閉じてから別のExecuteReaderを呼び出す様に
注意されてしまいます。
"追加情報 : この接続に関連付けられている DataReader が既に開いています。この DataReader を最初に閉じる必要があります"
でも最初のループ文の中で処理を行いたいのです!
配列にデータを入れてからその配列の中のループ文の中で
ExecuteReaderをよぶしかないのでしょうか?
どなたか回避策がありましたら教えて下さい。

Dim myConnString As String = _
"User ID=myUID;password=myPWD;Initial Catalog=pubs;Data Source=mySQLServer"
Dim mySelectQuery As String = "SELECT * FROM Titles"
Dim myConnection As New SqlConnection(myConnString)
Dim myCommand As New SqlCommand(mySelectQuery, myConnection)
myConnection.Open()
Dim myReader As SqlDataReader = myCommand.ExecuteReader()
While myReader.Read()
   invIPADDR = Trim(myReader.Item("IPADDR"))
-----------ここから更に別なSQL文を呼び出したい!----------

  Dim mySelectQuery1 As String = "SELECT * FROM Titles where ip='" & invIPADDR & "'"
Dim myCommand1 As New SqlCommand(mySelectQuery1, myConnection)
Dim myReader1 As SqlDataReader = myCommand1.ExecuteReader()
While myReader1.Read()
'処理
Loop
End While
myReader.Close() 'Close the reader.
KATSU
常連さん
会議室デビュー日: 2003/02/13
投稿数: 33
お住まい・勤務地: 静岡県
投稿日時: 2003-12-17 19:01
その1:2回目のループのSqlConnectionを分ける(別物を使う)
その2:1回のSQL発行で片付ける。(同一テーブルをLEFT JOINして)

とかではダメでしょうか?

その2は仕様的に可能か解りませんが...

[ メッセージ編集済み 編集者: KATSU 編集日時 2003-12-17 19:14 ]
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2003-12-19 02:08
DataAdapterを使ったロジックに変更するというのがスペックはともかく、一番手っ取り早く実現は出来そうですね。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-12-19 06:27
 こちらに転記するときに端折っただけとは思いますが。。。
 SqlCommandもSqlReaderもSqlConnectionも、外部リソースを使用するものなので、ループの中でこのような使い方をすると、あっという間にリソースを使い果たします。
#Oracleでやると、カーソル数の上限に達しました、になる
必ずDisposeまたはCloseするか、ループの外で作ったものを使い回しましょう。
1

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