4

我正在重写这个长 INSERT 语句和参数,它看起来像这样:

    cmd.Parameters.AddWithValue("@Website", General.fnSQLNullValues(tWebsite.Text))

General.fnSQLNullValues 是这样的:

        Public Shared Function fnSQLNullValues(ByVal sValue As Object, Optional ByVal Len As Integer = 999999) As Object
            If sValue Is Nothing Then Return DBNull.Value
            fnSQLNullValues = IIf(sValue.ToString.Length = 0, DBNull.Value, Left(sValue.ToString(), Len))
        End Function

我根本不喜欢这个,而且似乎需要很多代码才能做到这一点,

       cmd.Parameters.AddWithValue("@Website" , If(tWebsite.Text , DBNull.Value))

据我了解,如果 tWebsite.Text 为 null 或不被接受,那一行代码 DBNull.Value 将替换 tWebsite.Text 作为值,在我看来,它与一般的其他函数做同样的事情。这是正确的吗?一种方法比另一种更好吗?

另外,我从第二种方式收到警告:“无法推断通用类型;假定对象”,但在我看来,第一种方式无论如何都是使用通用对象,所以我不知道我是否应该忽略这个警告

4

1 回答 1

5

在代码中使用数据库参数时,字符串有点棘手。如果您有一个空字符串,它将传递一个空字符串值进行插入。但是,如果您将字符串设置为 Nothing 值,它将在数据库中插入一个 NULL 值。否则它将设置一个空字符串。

理想情况下,您应该在数据层之上有某种业务层,它将检查您的 tWebsite.Text 值,并将 Nothing 或 Text 值传递给设置参数的函数。这与您上面的第一个代码示例略有不同。这样,您的数据层只需执行以下命令:

cmd.Parameters.AddWithValue("@Website" , valueWebsite))

......没有麻烦是必要的。

对于其他数据类型(例如整数、小数等),请查看Nullable Types并使用它们。它们使事情变得非常容易使用。默认情况下,它们初始化为 Nothing,因此如果您不为它分配一个值(从您的输入框中),该值将保持为 Nothing,并且会在数据库中执行正确的 NULL 插入。

于 2012-07-06T22:34:15.670 回答