• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VB.Net データ読み取りの For Each)

VB.Netデータ読み取りで変数を使用して全データを取得する方法

このQ&Aのポイント
  • VB.Netでデータを読み取る際、変数を使用して全データを取得する方法を知りたいです。
  • 具体的には、SQLDrオブジェクトを使用して項目名を直接指定せずに全フィールドの値を取得したいです。
  • WhileループとForEachループを組み合わせて、データの座標と値を取得し、一括して取得したいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

SqlDataReader.itemプロパティは、引数としてString(列名)の他にInteger(列番号)を取ることができる。なのでご要望としては以下の通りになるのかな。一番内側のループでCntFieldの0~SQLDr.FieldCount-1が列番号になるので、これをインデックスとして配列にぶっこむがいい。 Dim SQLCon As SqlConnection = New SqlConnection(接続文字列) Dim SQLCmd As SqlCommand = New SqlCommand(SQL文, SQLCon) SQLCon.Open() Dim SQLDr As SqlDataReader = SQLCmd.ExecuteReader Dim value As Boolean value = SQLDr.HasRows 'True と仮定します     Dim Cnt as Integer = 0     While SQLDr.Read()         For CntField As Integer = 0 To SQLDr.FieldCount - 1 Step 1             Dim o As Object = SQLDr(CntField) ' ここを適当に直して!         Next       Cnt = Cnt + 1 'レコードの位置     End While     ’*********************************************************** SQLDr.Close() SQLCon.Close()

kyokotan12
質問者

お礼

anmochi さん お世話になります。 ご提示いただいた記述にて無事に座標データとともに値データも取り出すことができました。MARU4812 さんのご指摘があった出力順番は保障されないことも念頭におき作業を進めようと思います。 100以上のフィールドの出力のコーディングを考えた場合、萎えそうな気持ちになり、こちらで質問させていただいた次第でございます。 大変勉強になりました。ありがとうございました。

その他の回答 (2)

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.3

> 出力順番は保障されないことも念頭におき作業を進めようと思います。 ん? いやそんな事はないよ。 select A, B, C from TABLE1 order by A の結果を受け取る場合、 SqlDataReader.item(0)は絶対にA列を指す事がADO.NETによって保証されている。 まぁ、SQLを select D, A, B, C from TABLE1 order by A に直したのにその後ろのプログラムを直してなくって痛い目を見る、またはSQLを select * FROM TABLE1 order by A とかにしといてTABLE1の構造を変えたのにプログラムを直してなくってシステム全体が大変な事になる、というのはあるけど。 しかしこれらはプログラマーの凡ミスまたはシステム改修計画の不備であり、SqlDataReader.item(0)がランダムに違う列を指す(出力順番が保証されない)からではないよね。 もちろん、SQLの方で出力列(select句)をきっちり記述するとか、列のインデックスアクセス+何かに起因する無用なバグを発生させないようなしっかりとしたプログラムを書く必要はあると思うけど。

kyokotan12
質問者

お礼

anmochi さん お世話になります。 100以上のフィールドのことを考えると、select * FROM TABLE1 の形になろうかと思います。なるべく無用なバグを発生させないよう、最悪の時はすべての列をSelect句に記述する方向で進めようと思っております。 重ね重ねありがとうございました。

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.2

質問の回答は#1さんの回答通りです。 でも一般的に、データベースにおいて各フィールドも各データも等価で 明示しない限り順番は保障されていないから、この手のプログラムで 痛い目見たことのある技術者はインデックスで取り出す事は稀だけどね。 SQL文で明示できているなら問題ないけどね。その場合はフィールド名を 指定できたり、フィールド名にルールを作ってプログラムでフィールド名を 生成する場合が多いです。インデックスを指定していると、プログラムの 修正に非常に弱いです。フィールドが後から追加されるとエラーが出ずに データが全部ずれちゃったりするからね。

kyokotan12
質問者

お礼

MARU4812 さん お世話になります。 なるほどインデックスで取り出す際は出力される順番は保障されないのですね、肝に命じておきます。 今回の主旨は、Excelシートに出力するのに座標としてのデータがほしかったのです。フィールドが100近くあり、すべてのフィールドの記述をするととんでもない作業と手作業によるミスがあるかと思い、今回質問させていただきました。 出力される順番が保障されないということは、ご指摘どおりフィールド名を記述してコーディングする必要もあると念頭におき作業にあたろうと思います。 ありがとうございました。

関連するQ&A