DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ExecuteReaderで取得した情報のループ処理

環境/言語:[XP VB.NET Framework2.0]
分類:[.NET]

いつも利用させて頂いています。

表題ループ処理で1レコード目が設定できないという現象で困っています。

DBからExecuteReaderで取得した情報をGridに設定しようとし、
下記●のように書いたのですが、設定されるのは2レコード目からで
1レコード目が設定できませんでした。
while条件のReadメソッドで次のレコードに移動してしまい、
whileの中に入ったら2レコード目になってしまっているようです。
(whileの前に「objReader("hoge").ToString()」を見ると1レコード目
の情報です。)
色々なサイトで●のような書き方をしているのですが、1レコード目も
うまく設定できるのでしょうか?何かわたしの方が処理が抜けていたり
するのでしょうか?
どなたか詳しい方教えてください。m(._.)m 

仕方ないので今は■のような書き方にして正しく1レコード目から設定できる
ようにしています。

●1レコード目が設定できない
 While (objReader.Read())
     gldList(i, 0) = objReader("hoge").ToString()
     i += 1
 End While

■正しく設定できる
 EndFlg = True
 While EndFlg = True
     gldList(i, 0) = objReader("hoge").ToString()
     i += 1
     If objReader.Read() = False Then
         EndFlg = False
     End If
 End While
■No16583に返信(トップ姫さんの記事)
> while条件のReadメソッドで次のレコードに移動してしまい、
> whileの中に入ったら2レコード目になってしまっているようです。
> (whileの前に「objReader("hoge").ToString()」を見ると1レコード目
> の情報です。)

その前にどっかでReadしてるんじゃない?
はいこーんさん、こんにちは。返信ありがとうございます。

>その前にどっかでReadしてるんじゃない?

わたしもそう思って下記のようにWhileの直前で見てみたんですが、
Whileに入る直前は確かに1レコード目が見れています。
でもWhileに入ると2レコード目になってるんです。

 MessageBox.Show(objReader("hoge").ToString())  ←ココでは1レコード目
 While (objReader.Read())
     gldList(i, 0) = objReader("hoge").ToString()
     i += 1
 End While
Whileの前で1行目が読めているのなら、WhileでobjReader.Read()すれば、当然2行目を読むことになります。
Whileの前はどのようなコードになっていますか?そこに問題があるのだと思います。
こんにちは。

trapemiya さんのおっしゃるとおり、While の前での objReader("hoge").ToString() が
1レコード目の内容をあらわすのであれば、その次の While で objReader.Read() する
ことで2レコード目になりますよね。
(実はその辺を誤解していて、さっき一度書いて消してしまいました)

「While に入る直前は確かに1レコード目が見れている」というのがそもそも怪しいです。
このループ(MSDN のサンプルと同じような感じだと思いますが)であれば、While の時点
で objReader.Read() することによって初めて1レコード目に移動するはずで、その前の
MessageBox で1レコード目が見えているということは、やはりその前に Read() した形跡
があるのではないでしょうか。

While の前の部分を少し調べてみてくださいね。
■No16594に返信(ぽぴ王子さんの記事)
> MessageBox で1レコード目が見えているということは、やはりその前に Read() した形跡があるのではないでしょうか。
> While の前の部分を少し調べてみてくださいね。

おそらくですが、「式ウォッチ」で "実行してしまっている" のではないでしょうか?
「式ウォッチ」で見る値は実行した結果です。
当然実行すれば、次のレコードに進められてしまいます。
>その前にどっかでReadしてるんじゃない?
>While の前の部分を少し調べてみてくださいね。

スミマセン!!!(>_<")

みなさんの推察どおり前でReadしてました。

抽出結果の件数確認でRead値を見ていました。

If objReader.Read = False Then
    データなしメッセージ処理
End If

ここを HasRowsプロパティを見て判断するようにしたところ、
最初に書いた■の処理で1レコード目から正しく見れるように
なりました。

最近詰めて仕事やってたせいか盲目になっていました。
恥ずかしい限りです(/-\*) 

つまらないことでみなさんの貴重なお時間を使わせてしまい
大変恐縮です。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板