SQL数据读取器 - 如何优雅地处理空列值

4

我正在使用SQLDataReader从数据库检索可能为空的值。我已经学会如何处理空字符串值,但无法用同样的技巧处理整数或布尔值:

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操作数必须是引用类型,但整数?是值类型”的编译错误。

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值。

我喜欢这个想法,但在函数中将“Return = checkValue”更改为“Return checkValue”(微小的更改)。 - Darkloki
@Darkloki:已更改。 - dummy

3
你可以利用SqlDataReader的IsDBNull方法,并使用VB.NET三元运算符为你的poco对象分配默认值。
.StatusXML = If(reader.IsDBNull(reader.GetOrdinal("StatusXML")), _
             "",reader.GetString(reader.GetOrdinal("StatusXML")))

这只是一行代码,不太优雅,因为你需要调用两次GetOrdinal方法。


是的,正如你所指出的那样,它并不是非常优雅,我希望能有更简洁的解决方案。 - Robin G Brown

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

1
虽然这段代码可能回答了问题,但您还应该提供代码如何回答问题的方式,在这种情况下,为OP的问题提供实现步骤。 - Grinn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接