DBからデータを取得したいだけなのですが、
デバッグで1行ずつウォッチしていくと
どんな行でもReadしたのと同じように次のデータを見に行ってしまいます。
下のコードを実行すると、欲しいデータの次の行がaaaに入ってきてしまいます。
どうしてなのでしょうか。
cmd.CommandText = "select KOJIN_NO,SHIMEI from SHAIN order by KOJIN_NO"
cmd.CommandType = CommandType.Text
cmd.Connection = cn
dr = cmd.ExecuteReader
Dim strFirstKey As String = dr.GetName(0)
Dim strSecondKey As String = dr.GetName(1)
Dim aaa As String
'DataReaderから1行ずつ読み込む
Do While (dr.Read())
If "9999" = dr.Item(strFirstKey) Then ①
aaa = dr.Item(strSecondKey) ②
Exit Do
End If
Loop
'接続を閉鎖する
dr.Close()
cn.Close()
きっと、①でヒットした値はあっているのに
②の処理で次のデータを読みに行ってしまっています。
①と②の間にメッセージBoxを表示させる処理を入れたら
次の次のデータがaaaに入ってきました。
どなたかHelpをお願いいたしますm(_ _)m
ふつう
dr.Item(strFirstKey)←の時点で「次のレコードを参照」となっていると思うので、当然
If "9999" = dr.Item(strFirstKey) Then ←の時点で目的のレコードを参照し
aaa = dr.Item(strSecondKey) ←の時点でその次のレコードを参照するでしょう。つまりIf文で判定に使っているdr.Item(strFirstKey)とaaaに代入しているdr.Item(strFirstKey)は別物だと思います。
もちろん間に
MsgBox dr.Item(strSecondKey) とすれば、また次のレコードを参照するでしょう。
Dim strData as String
Do While (dr.Read())
strData = dr.Item(strFirstKey)
If "9999" = strData Then
aaa = strData
Exit Do
End If
Loop
↑のようにして、dr.Item(strFirstKey)は一度だけ変数に
代入して処理してみては?
↓こうかも
Dim strData1 As String
Dim strData2 As String
Do While (dr.Read())
strData1 = dr.Item("KOJIN_NO")
strData2 = dr.Item("SHIMEI")
If "9999" = strData1 Then
aaa = strData2
Exit Do
End If
Loop
>↓こうかも
処理的には質問者の示したコードと変わらなくなってるかも(^^;)
dr.Item の繰り返しでレコードが進むことは確認できませんでした。
あとは、データ型が曖昧なのですが、質問者のコードでも暗黙の型変換
で String 型で比較されてると思いますので問題なしと判断しました。
で、
開発環境が書かれていません。データベース関連は、データベースの種類、
VBのバージョン・使用してるオブジェクトのバージョンなどに特に影響されます。
書いて無い場合、解決する意思なしと見なします。
VB.NET2003 Access 2002でテストしました。
コード的には特に問題なさそうです。
[VB.NET]
Do While (dr.Read())
Debug.WriteLine(dr.Item(strFirstKey).ToString & ", " & dr.Item(strSecondKey).ToString)
Loop
…とでもやってどんなレコードがどの順番で取れてきてるか『全て』確認して下さい。
Do While (dr.Read())
Debug.WriteLine(dr.Item(strFirstKey).ToString & ", " & dr.Item(strSecondKey).ToString)
Debug.WriteLine(dr.Item(strFirstKey).ToString & ", " & dr.Item(strSecondKey).ToString)
'・・・
Loop
と繰り返しても dr.Item で暴走と言われる様な現象は確認できませんでした。
>次のデータ
これが意味不明ですが、『次のレコード』という意味であれば、そもそも
レコード間の順番など保証されていませんので、意味がありません。
レコードのデータ更新等で Access でテーブルを参照した場合に表示
される順番とは全く違う順番でデータが取れるようになると思います。
『レコードを順番通り』と考えるのであれば、その『順番』を指定できる
フィールドを追加して、そのフィールドで ORDER BY してレコードの
順番を保証して下さい。
> そのフィールドで ORDER BY してレコードの順番を保証して下さい。
それが、
>> cmd.CommandText = "select KOJIN_NO,SHIMEI from SHAIN order by KOJIN_NO"
じゃないの?
>>> cmd.CommandText = "select KOJIN_NO,SHIMEI from SHAIN order by KOJIN_NO"
>じゃないの?
…ホントだm(__)m目に入ってなかったです。
…では、
現象を再現できませんでした。
>次のデータ
という意味が曖昧ですので、具体的にデータベースに登録されている
データを示すなどして、どんな現象なのか説明して下さい。
多数のご教授ありがとうございます。
いろいろ試したところ、
プロジェクトから新たに作り直し、クラスの中身を
ご指摘どおりORDER BY を追加し他は全コピーしたら、
なぜか暴走という現象がなくなりました。
原因はまったくわかりません。ORDER BY 以外にもありそうです。
コネクションやdrをきちんと廃棄していないとこのような現象に
なのでしょうか?実装テストをして、何回も途中で落ちているうちに
残ってしまってい大きなゴミとなったのかと、にらんでいます。
VB.NETは、コンパイルが通らなくても実装できてしまうところが
便利でいて恐怖でもあります。(おわかりと思いますが超初心者です)
このままだと、すごく危険なソースができあがってしまいそうなので
全部細かく見直そうと思いました。
すみません、書き忘れましたがVBはV6で、SQLServerを使っています。
「次のデータ」は、おっしゃるとおり「次のレコード」です。
ORDER BY 忘れていました。ありがとうございます。
ツイート | ![]() |