如何优雅地处理空列值
我正在使用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操作数必须是引用类型,但是整数? 是一个值类型的编译器错误。
我在这种情况下使用以下功能:
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作为第二个参数,则此函数需要传递应使用的值。
您可以利用SqlDataReader的IsDBNull方法并使用VB.NET三元运算符为您的poco对象分配默认值
.StatusXML = If(reader.IsDBNull(reader.GetOrdinal("StatusXML")), _
"",reader.GetString(reader.GetOrdinal("StatusXML")))
它只是一行,不是很优雅,因为你需要调用两次GetOrdinal方法。
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
链接地址: http://www.djcxy.com/p/42853.html