System.Data.SqlTypes和NULL

时间:2010-10-26 00:08:04

标签: .net sql-server vb.net

如果我有一个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时怎么做?

1 个答案:

答案 0 :(得分:1)

第一个想法:
在创建参数的新实例时,您需要明确指定类型。否则,框架将尝试推断类型,这绝不是你应该指望正确的方式。

Dim parameter As New SqlParameter("@SomeName", SqlDbType.[Decimal])
parameter.Value = 3.2

第二个想法:
而不是创建SqlDecimal值尝试使用简单的可空小数。这样就不必转换,也可以避免错误。

Dim test As System.Nullable(Of Decimal) = 3.2