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