【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項目やプロパティに変更があってもコードを書き換えなくてもよく楽チンです。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です