0

我目前正在做一个简单的项目,显示人员列表,基本上表明他们是在办公室还是在办公室。人们还可以编辑列表以指示他们是在办公室还是在外面,并更新一条消息,说明他们什么时候回来。

我的问题是,当我更新列表时,我收到一条错误消息,指出我的更新语句中存在语法错误,但我找不到它。我正在使用 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

任何帮助将非常感激。谢谢你。

4

1 回答 1

5

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 语句,以确保在您完成使用连接对象后正确关闭和处置连接对象。

于 2013-03-27T16:53:31.687 回答