3

我正在使用 SQLDataReader 从数据库中检索可能为空的值。我已经研究出如何处理 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)

那么如何优雅地设置空整数或布尔值呢?我在 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 作为第二个参数。

于 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 方法。

于 2013-10-02T09:23:43.780 回答
1
Public Function NotNull(Of T)(ByVal Value As T, ByVal DefaultValue As T) As T
    If Value Is Nothing OrElse IsDBNull(Value) Then
        Return DefaultValue
    Else
        Return Value
    End If
End Function
于 2014-08-22T19:06:08.127 回答