vb.net关键字where附近的语法不正确

时间:2014-01-29 18:45:17

标签: sql vb.net

关键字WHERE

附近的语法不正确
Dim cmd As New SqlCommand
        cmd.Connection = conn
        cmd.CommandText = "UPDATE main WHERE ID = '" & ID.Text & "'" & vbCrLf & _
        "SET Date = '" & _date.Text & "'," & vbCrLf & _
        "Artist = '" & artist.Text & "'," & vbCrLf & _
        "City = '" & City.Text & "'," & vbCrLf & _
        "Venue = '" & venue.Text & "'"
cmd.ExecuteNonQuery()

我不明白为什么我会收到此错误。我试过改变它的每一个小东西???

2 个答案:

答案 0 :(得分:1)

UPDATE的正确语法是

UPDATE tablename SET field1=Value1,..... WHERE keyField=keyValue

所以你的查询应该写成

Dim cmd As New SqlCommand
cmd.Connection = conn
cmd.CommandText = "UPDATE main SET Date = @dt, Artist = @art, City = @city," & _
                  "Venue = @ven WHERE ID = @id"

cmd.Parameters.AddWithValue("@dt", date.Text )
cmd.Parameters.AddWithValue("@art", artist.Text )
cmd.Parameters.AddWithValue("@city", City.Text )
cmd.Parameters.AddWithValue("@ven", venue.Text )
cmd.Parameters.AddWithValue("@id", ID.Text )
cmd.ExecuteNonQuery()

注意如何删除字符串连接并使用查询文本的参数更多 可以理解且更容易验证 当然,这也消除了Sql Injection和解析问题的任何可能性 但是,如果您的任何字段不是文本类型,则这可能不完全正确 如上所述,所有参数的值都作为字符串传递,如果(例如)您的Date字段是smalldatetime而不是字符串(或ID是数字),这可能会导致问题。

答案 1 :(得分:0)

WHERE ID = '" & ID.Text & "'"SET Date = '"之间没有空格(当你发送它时,vbcrlfs并没有真正转换为Sql)。您的文本框中可能还有一些内容包含撇号,这会导致其中一个sql字符串提前终止。

由于这个原因(因此无法通过Sql Injection进行攻击),您应该使用SqlParameter s。

想象一下,例如。我将';Truncate Table main;'输入_date.Text。您的查询突然显示如下:

Update main Set Date = ''; Truncate Table main;'', Artist = '', City = '', venue = '', where id = ''

其中大部分都会失败,但Truncate Table main可能会执行并清除您的数据。

要解决此问题,请使用SqlParameter

    Dim conn As New SqlConnection()
    Dim cmd As New SqlCommand

    cmd.Parameters.Add(New SqlParameter("ID", ID.Text))
    cmd.Parameters.Add(New SqlParameter("Date", _date.Text))
    cmd.Parameters.Add(New SqlParameter("Artist", artist.Text))
    cmd.Parameters.Add(New SqlParameter("City", City.Text))
    cmd.Parameters.Add(New SqlParameter("Venue", venue.Text))

    cmd.Connection = conn
    cmd.CommandText = "UPDATE main " & vbCrLf & _
                        "SET Date = @Date, " & vbCrLf & _
                        "Artist = @Artist, " & vbCrLf & _
                        "City = @City, " & vbCrLf & _
                        "Venue = @Venue " & vbCrLf & _
                        "WHERE ID = @ID"


    cmd.ExecuteNonQuery()