试图更新记录,不断收到此错误vb.net

时间:2011-11-07 16:36:02

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

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

    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'附近的语法不正确。

如果文本框中没有任何内容,则错误更改为: ','。

附近的语法不正确

我对此很新,我似乎无法理解为什么会这样。 非常感谢您的帮助。 :)

2 个答案:

答案 0 :(得分:1)

这个错误。

  1. 每个逗号后面都需要一个空格,而不是之前。
  2. 您应该在查询中使用它们之前转义您的值。如果我在任何一个文本框中加上“0 WHERE 1 = 1 - ”,它将会丢弃整个表格。
  3. 您应该始终正确命名表单控件。如果我在一年的时间内将您发回给您的代码并告诉您TextBox44存在问题,您会知道这意味着什么吗?您的变量也是如此。对于变量名称,有时可以ixtbl,但通常它们应该是描述性的。

  4. #2的示例,其中我将''1/1 / 1999'WHERE 1 = 1 - “放入TextBox45:

    `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?

答案 1 :(得分:0)

您永远不应该使用字符串连接来构建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的文档中窃取了该代码。