「アクセスする Original データがありません。」と言われたら[プログラミング]
(2024-04-04 20:29:45) by shinoda


VB.NET で画面の表にバインドしているデータテーブルの中身を、編集前、編集後の値で比較してほげほげしたいという処理がある。

データテーブルのレコード自体は、編集前のものであれば列名の後ろに DataRowVersion.Original というバージョン情報を引数で設定してやればいい。
編集前は dr("人数", DataRowVersion.Original) 、編集後の値は dr("人数") という具合

そこで、例えば職種をキーとしたハッシュテーブル(連想配列)に編集前と編集後の人数をセットしていって、あとで同じキー(同じ職種)の人数の変異を見たいと思って、

For Each dr As DataRow In DataTable1.Rows
    HTOld(dr("職種", DataRowVersion.Original).ToString) = dr("人数", DataRowVersion.Original).ToString
    HTNew(dr("職種").ToString) = dr("人数").ToString
Next

なんてやると、編集前の値のない行(つまり、追加された行)データが出てくると、

System.Data.VersionNotFoundException: 'アクセスする Original データがありません。'

という例外が発生する。

Not IsDBNull(dr("職種", DataRowVersion.Original)) とかしたら回避できるかなとも思ったけど、データがそもそも無いので Null でもない。

Try で例外引っ掛けて、それを「オリジナル行のない追加されたデータである」と判断してもいいかなとも思ったが、結局、RowState をチェックすることで回避した。

If dr.RowState <> DataRowState.Added Then
    HTOld(dr("職種", DataRowVersion.Original).ToString) = dr("人数", DataRowVersion.Original).ToString
End If

If dr.RowState <> DataRowState.Deleted Then
    HTOld(dr("職種") = dr("人数").ToString
End If

みたいな感じ。

他にきれいなやり方があるのなら教えてほしい>VB.NET マスターの皆さん

Perl 使いの俺としては、こういう処理で引っかかるの、本当に面倒くさくていや(笑)

コメント投稿
次の記事へ >
< 前の記事へ
TOPへ戻る

Powered by
MT4i 3.0.8