我在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
答案 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
value3
是string
,根据documentation,string.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
然后,您必须调整以后的代码,以便不添加这些引号本身。