3

SQLDataReader を使用して、null の可能性があるデータベースから値を取得しています。Null 文字列値を処理する方法を考え出しましたが、同じトリックを整数またはブール値で使用することはできません。

Using cmd As DbCommand = store.GetStoredProcCommand("RetrievePOCO")
    store.AddInParameter(cmd, "ID", DbType.Int32, ID)
    Using reader As IDataReader = store.ExecuteReader(cmd)
        If reader.Read() = True Then
            Dim newPOCO As New POCO()
            With newPOCO
                'If the source column is null TryCast will return nothing without throwing an error
                .StatusXML = TryCast(reader.GetString(reader.GetOrdinal("StatusXML")), String)
                'How can a null integer or boolean be set elegantly?
                .AppType = TryCast(reader.GetInt32(reader.GetOrdinal("AppType")), System.Nullable(Of Integer))
                .Archived = TryCast(reader.GetBoolean(reader.GetOrdinal("Archived")), Boolean)

では、null 整数またはブール値をエレガントに設定するにはどうすればよいでしょうか。C# で提案を見たことがありますが、VB に正しく変換されず、'TryCast オペランドは参照型である必要がありますが、整数ですか? 値型のコンパイラ エラーです。

4

3 に答える 3

5

このシナリオでは、次の関数を使用します。

Public Shared Function NoNull(ByVal checkValue As Object, ByVal returnIfNull As Object) As Object
    If checkValue Is DBNull.Value Then
        Return returnIfNull
    Else
        Return checkValue
    End If
End Function

コードは次のようになります。

With newPOCO
    .StatusXML = NoNull(reader("StatusXML"), "")
    .AppType = NoNull(reader("AppType"), -1)
    .Archived = NoNull(reader("Archived"), False)
End With

この関数では、値が DbNUll の場合に使用される値を 2 番目のパラメーターとして渡す必要があることに注意してください。

于 2013-10-02T12:57:20.113 に答える
3

SqlDataReaderのIsDBNullメソッドを利用し、VB.NET 三項演算子を使用して poco オブジェクトにデフォルト値を割り当てることができます

.StatusXML = If(reader.IsDBNull(reader.GetOrdinal("StatusXML")), _
             "",reader.GetString(reader.GetOrdinal("StatusXML")))

GetOrdinal メソッドを 2 回呼び出す必要があるため、これは 1 行に過ぎません。

于 2013-10-02T09:23:43.780 に答える