CallByName で動的に作った項目名で DBNull 例外のハンドリングできんのかいな?

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

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マスターの皆さん、是非ご教示を!

トラックバック(0)

このブログ記事を参照しているブログ一覧: CallByName で動的に作った項目名で DBNull 例外のハンドリングできんのかいな?

このブログ記事に対するトラックバックURL: https://blog.netandfield.com/mt/mt-tb.cgi/3353

コメント(2)

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 って知らなかったので勉強になりました。ありがとうございます。

コメントする

このブログ記事について

このページは、shinodaが2015年3月13日 11:32に書いたブログ記事です。

ひとつ前のブログ記事は「「イタリアン居酒屋 fukuoka」の飲み放題コースはグー」です。

次のブログ記事は「長男坊の卒業式・・・と、「仰げば尊し」問題(笑)」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら