我用 OleDB 得到 "Syntax error in UPDATE statement"

I get "Syntax error in UPDATE statement" with OleDB

我正在开发一个与连接的数据源/MS Access 数据库一起工作的信息系统。这个问题有点陈词滥调,但我似乎无法从遇到的类似问题中找到合适的解决方案。

这是我的按钮代码。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    'myConnection.ConnectionString = connString
    'myConnection.Open()
    If Me.txtConfirmPasscode.Text = Me.txtNewPasscode.Text Then
        Dim updateCmd As OleDbCommand = New OleDbCommand("UPDATE Users SET Password = @ConfPasscode WHERE [Usernames] = @UsersID", myConnection)
        Dim dr2 As OleDbDataReader = updateCmd.ExecuteReader 'SYNTEX ERROR IN UPDATE STATEMENT

        With updateCmd.Parameters
            updateCmd.Parameters.AddWithValue("@value", txtUserID.Text)
            updateCmd.Parameters.AddWithValue("@firstname", txtConfirmPasscode.Text)
        End With

        updateCmd.ExecuteNonQuery()

        Dim recFound As Boolean = False
        Dim UserName As String = ""

        While dr2.Read
            recFound = True
            UserName = dr2("Usernames").ToString
        End While

        If recFound = True Then
            MessageBox.Show("Password changed successfully for " & UserName & ".", "Password Changed", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)

            'updateCmd.Parameters.Add(New OleDbParameter("Password", CType(txtConfirmPasscode.Text, String)))
        Else
            myConnection.Close()
            Me.Refresh()
        End If
    Else

    End If

    Try
        myConnection.Close()
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub

当我到达这些代码行时,我得到一个巨大的 UPDATE 语句语法错误:

Dim updateCmd As OleDbCommand = New OleDbCommand("UPDATE Users SET Password = @ConfPasscode WHERE [Usernames] = @UsersID", myConnection)
        Dim dr2 As OleDbDataReader = updateCmd.ExecuteReader 'I GET THE SYNTAX ERROR IN UPDATE STATEMENT ERROR HERE!

我希望我能得到一个解决方案,而不会过度格式化代码。我还想获得我的代码语法/语法的解决方案,这些解决方案可能会导致上述代码出现其他问题

密码是 ms-access 中的保留关键字。你需要在它周围加上方括号,但是你又遇到了另一个问题。您应该在执行查询之前设置参数,尽管 OleDb 不能按名称识别参数,而是按位置识别参数,但给出与占位符匹配的名称并没有什么坏处

Dim updateCmd As OleDbCommand = New OleDbCommand("UPDATE Users 
     SET [Password] = @ConfPasscode 
     WHERE [Usernames] = @UsersID", myConnection)
With updateCmd.Parameters
    ' First ConfPasscode because is the first placeholder in the query
    updateCmd.Parameters.AddWithValue("@ConfPasscode ", txtConfirmPasscode.Text)
    ' Now UsersID as second parameter following the placeholder sequence
    updateCmd.Parameters.AddWithValue("@UsersID", txtUserID.Text)
End With
Dim rowUpdated = updateCmd.ExecuteNonQuery
....

针对Andrew Morton 的以下评论,我应该提到AddWithValue 引起的问题。在这种情况下,仅使用字符串,这是一个性能问题,在其他情况下(日期和小数)可能会升级为正确性问题。

参考资料
Can we stop to use AddWithValue already?
How data access code affects database performance

此外,如另一个答案所述,用于更新查询的正确方法是 ExecuteNonQuery,但 ExecuteReader 也可以更新您的 table,但因为它构建了仅当您有内容可读时才需要的基础结构更新效率较低。在任何情况下都只使用 ExecuteNonQuery 或 ExecuteReader

我注意到您使用 executereader 执行更新命令。这意味着您将在更新后返回一条记录。在您的查询中,它只会触发更新查询。也许尝试将其放在存储过程中并在进行更改后选择更新的记录。