電気ウナギ的○○

About Home

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

shinoda (2015年3月13日 11:32)
どうも例外処理はよくわからんのお。

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

電気ウナギ的○○

電気ウナギ的○○

About Back

コメント(2)

Yasuhiro Spiegel ARAKAWA2015年3月13日 12:54

CInt じゃなくて TryCast 演算子を使うのはダメですか?

電気ウナギ的○○

電気ウナギ的○○

About Back

トラックバック(0)

トラックバックURL: https://blog.netandfield.com/mt/mt-tb.cgi/3353

電気ウナギ的○○

About This Site

電気ウナギ的○○
岩国在住。広島で働く超零細IT企業社長のいわゆる社長日記。
何か、酒と食い物のことばかり書いているようで・・・お察しのとおり、肥満体です:-)


2011/06/24
iPhone用サイト公開

Create with jQuery, jQTouch.


CLOSE