【问题标题】:SQL Data Reader - How to handle Null column values elegantlySQL Data Reader - 如何优雅地处理 Null 列值
【发布时间】:2013-10-02 09:09:39
【问题描述】:

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

【问题讨论】:

    标签: vb.net sqldatareader


    【解决方案1】:

    我在这个场景中使用了以下函数:

    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:改了。
    【解决方案2】:

    您可以利用 SqlDataReader 的 IsDBNull 方法并使用 VB.NET ternary operator 为您的 poco 对象分配默认值

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

    只有一行,不是很优雅,因为需要调用两次GetOrdinal方法。

    【讨论】:

    • 是的,它不像你指出的那样非常优雅,我希望会有更整洁的东西。
    【解决方案3】:
    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
    

    【讨论】:

    • 虽然此代码可能会回答问题,但您还应提供如何代码回答问题,以及在本例中为 OP 问题的实施步骤。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 2014-07-10
    • 2023-04-02
    相关资源
    最近更新 更多