MySqlデータベースからのデータでクラスを初期化したい。一部のフィールドはnullになる可能性があります。
Dim dr As MySqlDataReader = ...
Dim item As New Item(dr.GetInt16(0), dr.GetString(1), dr.GetString(2))
db内の最後の2つのフィールドがNULLである可能性があるため、そのフィールドでGetStringを呼び出すと例外が発生するとします。
各フィールドを取得する前に、NULLをテストするコードを確実に記述できます。
dim field1 as String
if ( dr.IsDbNull(1) )
field1 = Nothing ' or even ""
else
field1 = dr.GetString(1)
しかし、多くのフィールドがある場合、これは「ifs」の悪夢です。
この目的のために、私はIIf VB関数を書き直して、より型指定されたものにし、キャストを回避しました。
Namespace Util
Public Shared Function IIf(Of T)(ByVal condition As Boolean, ByVal iftrue As T, ByVal iffalse As T) As T
If condition Then Return iftrue Else Return iffalse
End Function
私が次のようなものを書くことができるように:
Dim item As New Item(
dr.GetInt16(0),
Util.IIf(dr.IsDbNull(1), "", dr.GetString(1),
Util.IIf(dr.IsDbNull(2), "", dr.GetString(2))
型指定されたIIfは他の場合にはうまく機能しますが、残念ながらこの場合は機能しません。これは、言語キーワードではなく通常の関数であるため、呼び出し中に各inpoutパラメーターが評価され、フィールドがNULLの場合は例外が発生します。 。
エレガントなif-lessソリューションを思いつくことができますか?