【问题标题】:Trying to update record, keep getting this error vb.net尝试更新记录,不断收到此错误 vb.net
【发布时间】:2011-11-07 16:36:01
【问题描述】:

我相信这个问题对你来说很容易...... :) 我只是尝试使用以下内容更新我的数据库中的现有记录:

    Private Sub Button12_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button12.Click

    If Not cnn.State = ConnectionState.Open Then
        cnn.Open()
    End If

    cmd2.Connection = cnn
    cmd2.CommandText = "UPDATE HireItemRecord SET HireItemBeginDate = " & TextBox45.Text & _
     " ,HireItemEndDate = " & TextBox44.Text & _
     " ,HireItemCost = " & TextBox16.Text & _
     " ,PaymentMethod = " & TextBox17.Text & _
     " ,Staff_Id = " & TextBox19.Text & _
     " ,HireItemNotes = " & TextBox18.Text & _
     " ,HireItemReturnDate = " & TextBox43.Text & _
     "WHERE HireRecord_Id = " & TextBox13.Text

    cmd2.ExecuteNonQuery()

    ds1.Clear()
    daHireItemRecord.Fill(ds1, "PersonDetails")
    cnn.Close()

End Sub

但是,无论选择什么记录以及框中的任何详细信息,我都会一遍又一遍地收到同样的错误: SqlException 未处理 '12' 附近的语法不正确。

当文本框中完全没有任何内容时,错误将变为: ',' 附近的语法不正确。

我对此很陌生,我似乎无法理解为什么会发生这种情况。 非常感谢您的帮助。 :)

【问题讨论】:

    标签: sql database vb.net textbox sql-update


    【解决方案1】:

    这件事大错特错。

    1. 每个逗号后面都需要一个空格,而不是前面。
    2. 您应该在查询中使用它们之前转义您的值。如果我在您的任何文本框中输入“0 WHERE 1=1 --”,它会破坏您的整个表格。
    3. 您应该始终正确命名表单控件。如果我在一年后将您送回此代码并告诉您 TextBox44 有问题,您知道这意味着什么吗?你的变量也是如此。有时可以使用i、x 或tbl 作为变量名,但通常它们应该是描述性的。


    #2 的示例,我在 TextBox45 中输入了“'1/1/1999' WHERE 1=1 --”:

    `UPDATE HireItemRecord SET HireItemBeginDate = '1/1/1999' WHERE 1=1 -- , HireItemEndDate...`
    

    -- 之后的所有内容都变成了评论,所以你得到这个:

     `UPDATE HireItemRecord SET HireItemBeginDate = '1/1/1999' WHERE 1=1`
    

    你能想象如果我执行那个查询会发生什么吗?没什么好说的。

    您应该使用参数化查询,按照此问题中的建议:Algorithm to avoid SQL injection on MSSQL Server from C# code?

    【讨论】:

    • 感谢您的建议,我会确保按您说的做。如果我能选择几个答案作为我接受的答案,那么所有答案都非常有用!
    【解决方案2】:

    您不应该使用字符串连接来构建 SQL。它使您容易受到 SQL 注入攻击。尝试使用 .Net 中提供的SQLCommand object。这使您可以“参数化”您的查询,而不必担心将 " 和 ' 放在哪里。

    它还允许您自然地添加参数,而无需将它们转换为字符串。像这样的:

    Dim command As New SqlCommand("SELECT * FROM Table", connection)
    command.Parameters.Add("@ID", SqlDbType.Int)
    command.Parameters("@ID").Value = customerID
    

    我从有关 SQL Parameters here 的文档中窃取了该代码。

    【讨论】:

    • 忘了谢谢你....谢谢!一切正常。老实说,我对这种方法一无所知(只编程了 6 个月左右,我第一次处理数据库),但我可以清楚地看到这种方法的好处。将来一定会听从您的建议。
    猜你喜欢
    • 2015-04-24
    • 2016-05-05
    • 2012-07-24
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    相关资源
    最近更新 更多