プログラミング: 2015年3月アーカイブ

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

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マスターの皆さん、是非ご教示を!
VB.NET で ComboBox のプルダウンリストに項目をセットする方法。

DB のマスタからデータ読み込んできて、そのコードと名前をセットしようとすると、

Me.CodeComboBox.SetBinding(ds.address, "address_code", "address_name")

みたいにバインディングしてしまうのが一番楽だが(これで、プルダウンのところに "コード|名前"のように表示される)、マスタの中身そのままではなく、後ろに「まとめコード」だったり「その他コード」だったり、マスタにないコードを追加したい時がある。

マスタを読み込んだデータセットの最後にレコードを追加してやってから SetBinding するという裏技的なことも可能だが、Null が許されてない項目にダミーの値をセットしたり面倒くさい。

そんな時は、素直にバインディング用の新しいテーブルセットを作って処理する方が結果的に簡単。

Dim codeTbl As New DataTable()
codeTbl.Columns.Add("address_code", GetType(Integer))
codeTbl.Columns.Add("address_name", GetType(String))
Dim row As DataRow = Nothing
For Each dr In ds.address
row = codeTbl.NewRow()
row("address_code") = dr.address_code
row("address_name") = dr.address_name
codeTbl.Rows.Add(row)
Next

' 合計コード(0)の追加
row = codeTbl.NewRow()
row("address_code") = 0
row("address_name") = "合計"
codeTbl.Rows.Add(row)

codeTbl.AcceptChanges()
Me.CodeComboBox.SetBinding(codeTbl, "address_code", "address_name")

これで、無事一番下に 0 の項目が追加される。(FormatString="000" で)

20150305_list.jpg

随分行数は増えるが、コードとして美しい。うっとり。

このアーカイブについて

このページには、2015年3月以降に書かれたブログ記事のうちプログラミングカテゴリに属しているものが含まれています。

前のアーカイブはプログラミング: 2015年2月です。

次のアーカイブはプログラミング: 2015年4月です。

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


月別 アーカイブ

電気ウナギ的○○ mobile ver.

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