【问题标题】:I get "Syntax error in UPDATE statement" with OleDB我在使用 OleDB 时收到“UPDATE 语句中的语法错误”
【发布时间】:2017-03-07 05:44:48
【问题描述】:

我正在开发一个与连接的数据源/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!

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

【问题讨论】:

  • Password 需要括号 [Password]
  • 包裹在try... catch 中并捕获异常?您是否也尝试过在 SQL Server 中运行更新查询?

标签: vb.net ms-access-2010 oledb insert-update


【解决方案1】:

Password 是 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 也可以更新您的表,但是因为它构建了一个仅在您有要阅读的内容时才需要的基础架构,因此更新效率较低.在任何情况下,只使用 ExecuteNonQuery 或 ExecuteReader

【讨论】:

  • 使用AddWithValue也可能会出问题。
  • @AndrewMorton 绝对是的,添加了一个关于 AddWithValue 问题的小参考
  • @史蒂夫。谢谢你。它有效,但我想要瞄准的密码似乎保持不变。
  • @ThabangRonin 您应该调试您的程序并确保txtConfirmPasscode.Text 具有您期望的值。
  • 并且 txtUserID.Text 匹配您数据表中的一些用户名记录
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多