如果我有一个SqlDecimal类型的变量X,它是在没有为构造函数提供十进制值参数的情况下实例化的,那么.IsNull属性为True:
Dim X As New SqlDecimal '.Value = Null
如果我有一个存储过程,它接受一个类型为Decimal的单个参数@SqlDecimalParameter,则此参数的值可以是NULL或十进制值。这就是我通常称之为存储过程的方式:
Dim Cmd As New SqlClient.SqlCommand
If X.IsNull Then
Cmd.Parameters.Add(New SqlClient.SqlParameter(parameterName:="@SqlDecimalParameter", value:=DBNull.Value))
Else
Cmd.Parameters.Add(New SqlClient.SqlParameter(parameterName:="@SqlDecimalParameter", value:=X.Value))
End If
但是,我希望以下方法可以正常工作,但是当X.IsNull为真时它不会。
Cmd.Parameters.Add(New SqlClient.SqlParameter(parameterName:="@SqlDecimalParameter", value:=X))
似乎第一个例子应该有效。我错过了什么吗?毕竟,我认为Sql数据类型设计用于SQL Server。
当X设置为以下
时commissionDue =新的SqlDecimal(3.2)
我收到以下错误:
Failed to convert parameter value from a SqlDecimal to a Decimal
当X.IsNull为True时它起作用。
如果你设置PARAM对象的值为NULL时怎么做?
答案 0 :(得分:1)
第一个想法:
在创建参数的新实例时,您需要明确指定类型。否则,框架将尝试推断类型,这绝不是你应该指望正确的方式。
Dim parameter As New SqlParameter("@SomeName", SqlDbType.[Decimal])
parameter.Value = 3.2
第二个想法:
而不是创建SqlDecimal值尝试使用简单的可空小数。这样就不必转换,也可以避免错误。
Dim test As System.Nullable(Of Decimal) = 3.2