将null插入数据库中的date列

时间:2014-08-05 00:59:37

标签: sql asp.net sql-server vb.net

我在vb.net中有一个gridview,我试图在数据库列中插入一个空值 - 不幸的是,我一直看到插入了1900-01-01。下面是我的代码,我需要帮助。

Protected Sub gvPOItems_RowCommand(sender As Object, e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles gvPOItems.RowCommand
  If (e.CommandName = "save") Then
   For i As Integer = 0 To gvPOItems.Rows.Count - 1
    Dim row As GridViewRow = gvPOItems.Rows(i)

    Dim value3 As String = DirectCast(row.Cells(9).FindControl("txtbxExpireDate"), TextBox).Text.Replace("'", "''")
    If String.IsNullOrEmpty(value3) Or value3.ToString() Is Nothing Then
     value3 = DBNull.Value.ToString()
    End If

 Next

End Sub

1 个答案:

答案 0 :(得分:3)

当值不为null时,它会起作用,因为您在该字符串中注入了值:

INSERT INTO table (datecolumn) VALUES ('2014-08-04')

但是,DBNull.Value.ToString()解析为空字符串。当您尝试通过易于SQL注入的方法将所述空字符串插入数据库时​​,您实际上正在运行如下查询:

INSERT INTO table (datecolumn) VALUES ('')

这就是默认值1900-01-01。你需要的是:

INSERT INTO table (datecolumn) VALUES (NULL)

您需要参数化查询。然后,您可以将Nothing直接传递给SQL命令,它将起作用。除此之外,你必须改变一些抽象,这样如果参数不是 ',你只会添加Nothing个字符,如果是,那么你需要通过字符串NULL


至于你的代码,这里也有一些错误。

Dim value3 As String = DirectCast(row.Cells(9).FindControl("txtbxExpireDate"), TextBox).Text.Replace("'", "''")
If String.IsNullOrEmpty(value3) Or value3.ToString() Is Nothing Then
 value3 = DBNull.Value.ToString()
End If

value3string,根据documentationstring.ToString()会返回原始值的未转换实例。换句话说,String.IsNullOrEmpty(value3)已经完成了你在后一种条件下检查的内容,除非后者条件为真,否则它将抛出NullReferenceException(或者等效于VB中的任何内容,我不知道它是否使用Nothing,因为我之前从未在VB中写过任何内容。)

接下来,您应该知道value3 永远不会成为Nothing。它直接来自TextBox.Text属性,因此最多为空字符串。这很好,因为你在IsNullOrEmpty中检查了这一点,但是自从你添加Is Nothing之后,我认为我最好指出这一点。

所以基本上,长话短说,参数化你的查询。我们所有的一切。但如果你绝对不这样做,这应该解决这个特殊问题:

Dim value3 As String = DirectCast(row.Cells(9).FindControl("txtbxExpireDate"), TextBox).Text
If String.IsNullOrEmpty(value3)
    value3 = "NULL"
Else
    value3 = "'" + value3.Replace("'", "''") + "'"
End If

然后,您必须调整以后的代码,以便不添加这些引号本身。