どうも例外処理はよくわからんのお。
VB.NET で、num01~num10 という項目のあるテーブルを DataSet に読み込んで処理しているんだけど、例えば
Dim sum As Integer = 0sum = sum + dr.num01sum = sum + dr.num02sum = sum + dr.num03~sum = sum + dr.num09sum = sum + dr.num10
なんて書くのは面倒臭いので、
For i = 1 To 10Dim 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 10Dim idx As String = i.ToString("00")Trysum = sum + CInt(CallByName(dr, "num" & idx, CallType.Get))Catch ex As System.Exception' 何もしないEnd TryNext
みたいに例外が発生したら何もせず次のデータの処理に移ろうと思っても駄目なんよねえ。
CallByName(dr, "num" & idx, CallType.Get) の処理で、DataSet を設定した時に自動生成される .Designer.vb ファイル内の
Return CType(Me(Me.hogeTbl.num01Column), Integer)
の処理で先に DBNull 例外が発生しちゃう。
仕方ないので(とりあえずプログラム動かさないといけないので)、
If Not dr.Isnum01Null Thensum = sum + dr.num01End IfIf Not dr.Isnum02Null Thensum = sum + dr.num02End IfIf Not dr.Isnum03Null Thensum = sum + dr.num03End If~If Not dr.Isnum09Null Thensum = sum + dr.num09End IfIf Not dr.Isnum10Null Thensum = sum + dr.num10End If
なんてベタ書きでやってるんだけど美しくないので、VB.NETマスターの皆さん、是非ご教示を!
CInt じゃなくて TryCast 演算子を使うのはダメですか?
ARAKAWA さん、ありがとうございます。
ちょっと試しに、
Dim obj As Object = TryCast(CallByName(dr, "num" & idx, CallType.Get), Object)
If Not obj Is Nothing Then
sum = sum + CInt(obj)
End If
とかやってみたんですが、TryCast(CallByName(dr, "num" & idx, CallType.Get), Object) の時点で、同じように .Designer.vb 内の処理が実行され、こいつが例外を発生しちゃって駄目なようです。
でも、TryCast って知らなかったので勉強になりました。ありがとうございます。