dポイントプレゼントキャンペーン実施中!

お世話になっております。

ArrayListを2つ使用して2次元配列のような事をしようとしております。

データベースから取得したデータの1行をArrayListItemへ格納してそのArrayListItemをArrayListRecordへ格納しようとしております。

追加し終わり最後にArrayListRecordの中身を見ると全て一番最後のデータで置き換わっています。

どなたかご存知でしたらお教え願います。


' 変数宣言
Dim objSqlDR As SqlDataReader
Dim alSetItem As ArrayList
Dim alSetRecord As ArrayList

alSetItem = New ArrayList
alSetRecord = New ArrayList

' データ取得分ループ
While objSqlDR.Read()

 alSetItem.Clear()

 For intSetIndex = 0 To (objSqlDR.FieldCount - 1)
  alSetItem.Add(objSqlDR(intSetIndex))
 Next intSetIndex

 alSetRecord.Add(alSetItem)
End While

A 回答 (2件)

alSetRecord.Add(alSetItem)


これは alSetItem の現在の値を alSetRecord に追加しているのではなく、alSetItem へのポインタを alSetRecord に追加しています。
よって alSetRecord に alSetItem のポインタがいくつ追加されようとも、全ては「ただ 1つの」alSetItem オブジェクトを指してしまうわけです。
そして alSetItem の中身はというと、最後のループで登録された中身なわけです。

alSetRecord.Add(alSetItem)
これを
alSetRecord.Add(alSetItem.Clone())
とするとか。
    • good
    • 0

 全てのレコードを個別に保持したいならば、ArrayList は1レコードずつ new しなければいけません。


 この例では、while 直後の clear() によって、データが全て消えてしまっています。

 end while 直前の .add() によって行われているのは、「クラス alSetItem をレコードとして登録する」という動作であり、値そのものをポイッと放り込んでいるわけではありません。

 よって、この例を正しく修正するには、"alSetItem = New ArrayList" の行を、while の直後に移動します。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!