将空值分配给数据行

时间:2017-07-13 04:26:43

标签: vb.net winforms

我在为属性赋值时尝试写一行IF条件。 我在VB.NET中尝试过这些语法,type_of_documents是可以为空的整数:

1)   vehicle.type_of_documents = If(vehicle.Istype_of_documentsNull, SqlTypes.SqlInt32.Null, vehicle.type_of_documents)
2)   vehicle.type_of_documents = If(vehicle.Istype_of_documentsNull, DBNull.Value, vehicle.type_of_documents)
3)   vehicle.type_of_documents = If(vehicle.Istype_of_documentsNull, Nothing, vehicle.type_of_documents)

嗯,我在一行中做这件事有点咄咄逼人。不知何故,所有这些语法都无法为我的数据库分配空值。语法1& 2有抛出整数异常。语法3没有错误,但数据库中没有更改/更新值(与之前相同)。

有人能告诉我更好的语法吗?因为我真的没有进入VB.NET。

提前致谢

2 个答案:

答案 0 :(得分:0)

If运算符基本上是通用的,即它返回的类型是从第二个和第三个参数的类型推断出来的。这意味着这两个参数必须是相同的类型,或者必须从另一个类型中分配。您只需要一个简单的演员阵容:

vehicle.type_of_documents = If(vehicle.Istype_of_documentsNull,
                               CObj(DBNull.Value),
                               vehicle.type_of_documents)

现在第一个参数被指定为类型Object,这两个参数共享一个类型。

答案 1 :(得分:0)

将从结果参数中推断If方法的返回类型(如@jmcilhinney已经回答的那样)。
在1和2个示例中,您会遇到强制转换异常,因为Integer无法转换为SqlTypes.SqlInt32.NullDbNull.Value类型。
第三个示例编译因为Nothing可以作为Integer引入,它只是Integer的默认值,等于0

如果您希望在DbNull.Value没有值的情况下返回type_of_documents,则需要在其公共类型Object中投射结果。

您可以创建一个返回SqlParameters所需的公共类型(对象)的扩展方法,而不是If方法

Public Module Extensions
    <Extension>
    Public Function GetValueOrDbNull(this As Integer?) As Object
        If this.HasValue Then Return this
        Return DBNull.Value
    End Function
End Module

并使用它

Dim sqlValue = vehicle.type_of_documents.GetValueOrDbNull()