2006年09月08日

Erase ステートメントの違い

VB2005でデータベースからExecuteReaderでデータを読み込み、配列に代入するルーチンを作ったがなぜかアプリケーションエラーが発生する。(下図)

エラー画面

DBからのデータ取得はこれまでさんざんやってきた作業なのでコードに問題があるとは思えなくVB2005(ADO.NET 2.0)になってDataReaderのクラスが変わったのかなと思って調べてみたのだが、特にそれらしい記載はない。コードも代入する直前まで問題なく動いているので原因がなかなか判らなかった。

こうした場合エラーの原因は意外なところにあるもので、今回の場合ADO.NETの使い方ではなく代入先の配列の使い方にあった。
代入しようとする配列(変数のタイプは構造体)がNothingになっていたのだ。
えー、ちゃんと初期化してあるし、なんで?と思ったが確かにNothingになっている(下図)

エラー時のコード

何故Nothingになってたのか考えてみたところ、直前にEraseしているのが原因らしい。
実はVB6ではこれで問題なく動いていたのだ。ところがVB2005(VB.NETでも同じ)ではEraceの動きが違っている。

VB6のヘルプを見るとEraceの機能は
静的配列[Dim hoge(5) 添字を指定して宣言]
・・・変数を初期化(数値は0に、文字列は"")してくれる。
動的配列[Dim hoge() 添字を未指定にして宣言する]
・・・メモリを開放。その後ReDimする必要あり。

VB2005でもVB6と同様に静的配列の初期化を想定していたのだ。しかしVB6とは違い自動で初期化してくれなかった(^^;
※VB6ではこの初期化の機能が大変便利で、構造体の内部変数を初期化するのに、Eraseで一回で済むようわざわざ配列にしたくらいである。

VB2005のヘルプには「各配列変数に Nothing 値を割り当てるのと同じ結果になります」とある。サンプルは下のようになっている。
Dim threeDimArray(9, 9, 9), twoDimArray(9, 9) As Integer
Erase threeDimArray, twoDimArray
ReDim threeDimArray(4, 4, 9)

※VB6では静的配列をReDimできないのに、VB.NETではできてしまう!

これで直した結果、エラーは無くなった。(下図)

修正後のコード


posted by なっちゃん at 15:30| 静岡 ☁| Comment(0) | TrackBack(0) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。