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



关键字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()

我不明白为什么我会犯这个错误。我试着改变它的每一件小事???

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注入和解析问题的任何可能性
但是,如果您的任何字段不是文本类型,则这可能不完全正确
写入时,所有参数的值都以字符串形式传递,如果(例如)您的Date字段是smalldatetime而不是字符串(或者ID是数字),这可能会导致问题。

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

出于这个原因(因此它不能通过Sql注入进行黑客攻击),您应该使用SqlParameters。

例如,想象一下。我在_date.Text中输入';Truncate Table main;'。您的查询突然看起来像这样:

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()

相关内容

最新更新