我在为属性赋值时尝试写一行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。
提前致谢
答案 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.Null
和DbNull.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()