关键字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()
我不明白为什么我会收到此错误。我试过改变它的每一个小东西???
答案 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()