我在OleDB

时间:2016-10-25 08:51:52

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

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

我希望我能找到一个无需过度格式化代码的解决方案。我还希望得到我的代码语法/语法的解决方案,这可能会在上面的代码中引起一些其他问题

2 个答案:

答案 0 :(得分:1)

密码是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

答案 1 :(得分:0)

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