CallByName で動的に作った項目名で DBNull 例外のハンドリングできんのかいな?[プログラミング]
(2015-03-13 11:32:57) by shinoda


どうも例外処理はよくわからんのお。

VB.NET で、num01〜num10 という項目のあるテーブルを DataSet に読み込んで処理しているんだけど、例えば

Dim sum As Integer = 0
sum = sum + dr.num01
sum = sum + dr.num02
sum = sum + dr.num03
 〜
sum = sum + dr.num09
sum = sum + dr.num10

なんて書くのは面倒臭いので、

For i = 1 To 10
Dim idx As String = i.ToString("00")
sum = sum + CInt(CallByName(dr, "num" & idx, CallType.Get))
Next

とかしてるわけですよ。

でも、例えば num01 が DBNull だと「'hogeTbl' にある列 'num01' の値は DBNull です。」という例外が発生してしまうんですね。まあ、当然。

ただ、

For i = 1 To 10
Dim idx As String = i.ToString("00")

Try
sum = sum + CInt(CallByName(dr, "num" & idx, CallType.Get))
Catch ex As System.Exception
' 何もしない
End Try
Next

みたいに例外が発生したら何もせず次のデータの処理に移ろうと思っても駄目なんよねえ。
CallByName(dr, "num" & idx, CallType.Get) の処理で、DataSet を設定した時に自動生成される .Designer.vb ファイル内の 

Return CType(Me(Me.hogeTbl.num01Column), Integer)

の処理で先に DBNull 例外が発生しちゃう。

仕方ないので(とりあえずプログラム動かさないといけないので)、

If Not dr.Isnum01Null Then
sum = sum + dr.num01
End If
If Not dr.Isnum02Null Then
sum = sum + dr.num02
End If
If Not dr.Isnum03Null Then
sum = sum + dr.num03
End If
 〜
If Not dr.Isnum09Null Then
sum = sum + dr.num09
End If
If Not dr.Isnum10Null Then
sum = sum + dr.num10
End If

なんてベタ書きでやってるんだけど美しくないので、VB.NETマスターの皆さん、是非ご教示を!

コメント(2)
次の記事へ >
< 前の記事へ
TOPへ戻る

Powered by
MT4i 3.0.8