【VB.NET】DBから取得した値を自動でクラスのプロパティにセットする
DBから何かの一覧を取得して画面に表示したいというとき、まずクラスに値をセットすると思います。
カラムを一つずつ指定してクラスのプロパティに値をセットしてももちろんできますが、さすがに面倒。
というわけでDBのカラムに対応するプロパティに自動で値をセットするようにしてみました。
実装したコード
クラス
アプリの情報を格納するためのクラスです。
アプリ名やリリース日、アプリの説明などをプロパティにもつCMobileAppItemと、それをリストにしたものを持っています。
Public Class CMobileApp
Public Property arrMobileApp As New List(Of CMobileAppItem)
Public Class CMobileAppItem
Public Property ixtblMobileApp As Long
Public Property sAppName As String
Public Property sReleaseDay As String
Public Property sNotes As String
Public Property arrTag As New List(Of String)
Public Property sURL As String
Public Property iOpen As Integer
End Class
End Class
自動でセットする部分
Dim clsMobileApp As New CMobileApp
Dim tpObject As Type = GetType(CMobileApp.CMobileAppItem)
For i = 0 To dtResult.Rows.Count - 1
Dim clsMobileAppItem As New CMobileApp.CMobileAppItem
For j = 0 To dtResult.Columns.Count - 1
If tpObject.GetProperty(dtResult.Columns(j).ColumnName) IsNot Nothing Then
tpObject.GetProperty(dtResult.Columns(j).ColumnName).SetValue(clsMobileAppItem,dtResult.Rows(i).Item(dtResult.Columns(j).ColumnName))
End If
Next
clsMobileApp.arrMobileApp.Add(clsMobileAppItem)
Next
①Typeでクラスの情報を取得できるようにする
まず対象のクラスのTypeを取得します。
Typeクラスというのはざっくりいうと型に関する情報を取得する機能をもったクラスです。
CMobileApp.CMobileAppItemクラスのプロパティに対して操作したいのですから、Typeに突っ込んでプロパティを取得できるようにします。
②DBのカラム名をループで回す
しれっと書いていますがdtResultはSQLの実行結果が入ったDataTableです。
まずは取得した件数分ループさせます。(ループ変数i)
そして、DBのカラムに対応したプロパティに値をセットしたいので、ネストしてDBのカラム一覧をループで回しています。(ループ変数j)
③SetValueで値をセットする
Type.GetProperty(プロパティ名)でプロパティの情報を取得したりメタデータにアクセスしたりできます。
1行で書いてしまっていますがGetPropertyの結果はPropertyInfoというクラスに格納されます。
PropertyInfoにはSetValueというメソッドがあり、値を格納したい具体的なインスタンスと値を引数として渡すことで値をセットすることができます。
ただし単純にカラムをループで回すだけだと、カラムには存在するけどクラスには存在しないものがあるとエラーになるので、Nothingのチェックを行っています。
DB項目やプロパティの増減にも対応しやすい
この方法だと、DB項目の分だけ値が自動でセットされるのでDB項目やプロパティに変更があってもコードを書き換えなくてもよく楽チンです。