更新语句中的 VB.NET 语法错误
Posted
技术标签:
【中文标题】更新语句中的 VB.NET 语法错误【英文标题】:VB.NET Syntax error in UPDATE statement 【发布时间】:2013-03-27 16:41:08 【问题描述】:我目前正在做一个简单的项目,该项目显示人员列表,并且基本上表明他们是在办公室还是在办公室。人们还可以编辑列表以指示他们是在办公室还是在外面,并更新一条消息,说明他们什么时候回来。
我的问题是,当我更新列表时,我收到一条错误消息,指出我的更新语句中存在语法错误,但我找不到它。我正在使用 Visual Studio 2012,在 VB.NET 中开发,并使用访问数据库,通过 OleDB 连接访问。
这是有问题的 VB 代码
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If InOutComboBox.SelectedItem = "IN" Then
MessageTextBox.Text = ""
End If
con = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\..\People.mdb")
con.Open()
If ListView1.SelectedIndices.Count > 0 Then
Dim comStr As String = "UPDATE tblStaffNames SET OutIn = '" & InOutComboBox.SelectedItem & "', Note = '" & MessageTextBox.Text & "' WHERE recid = " & ListView1.SelectedItems(0).SubItems(0).Text
cmd = New OleDbCommand(comStr, con)
Try
cmd.ExecuteNonQuery()
Catch ex As Exception
MessageBox.Show(ex.Message & " - " & ex.Source)
End Try
End If
ListView1.Clear()
LoadList()
End Sub
这是我运行代码时 comStr 的示例值
UPDATE tblStaffNames SET OutIn = 'OUT', Note = 'on vacation' WHERE recid = 26
任何帮助将不胜感激。谢谢。
【问题讨论】:
确切的错误信息是什么? 是每次都失败还是只是偶尔失败。当它失败时, MessageTextBox.Text 的值是什么? 如果您通过 Access 执行完全相同的 SQL 字符串,是否会出现错误? 显示的消息只是“UPDATE 语句中的语法错误”。 我认为 Note 是 MS-Access 中的保留字,但不确定这是否会导致错误 【参考方案1】:NOTE 是 Jet-MsAccess 的保留关键字。 在将命令提交给数据库引擎之前,您需要用方括号进行封装
您的查询还有另一个大问题。不能信任用户输入使用字符串连接直接发送到数据库。您应该使用参数化查询 (Sql Injection)
Using con = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\..\People.mdb")
con.Open()
If ListView1.SelectedIndices.Count > 0 Then
Dim comStr As String = "UPDATE tblStaffNames SET OutIn = ?, [Note] = ?" & _
" WHERE recid = ?"
cmd = New OleDbCommand(comStr, con)
cmd.Parameters.AddWithValue("@p1", InOutComboBox.SelectedItem)
cmd.Parameters.AddWithValue("@p2", MessageTextBox.Text)
cmd.Parameters.AddWithValue("@p3", ListView1.SelectedItems(0).SubItems(0).Text)
Try
cmd.ExecuteNonQuery()
Catch ex As Exception
MessageBox.Show(ex.Message & " - " & ex.Source)
End Try
End If
End Using
注意参数顺序,在 OleDb 中是位置性的,所以每个参数都应该按照 ?
占位符所期望的确切顺序出现在 Parameters 集合中。
另外,如您所见,我还添加了 Using 语句,以确保在您完成使用连接对象后正确关闭和处置连接对象。
【讨论】:
谢谢 现在可以使用了。这就是我得到的 1. 不知道,2 使用别人的数据库 谢谢,我还以为Note是个保留字,但是好久没用Access了,不知道怎么转义。以上是关于更新语句中的 VB.NET 语法错误的主要内容,如果未能解决你的问题,请参考以下文章
“INSERT INTO 语句中的语法错误”错误 - 错误是啥?