我正在开发一个与连接的数据源/ 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!
我希望我能找到一个无需过度格式化代码的解决方案。我还希望得到我的代码语法/语法的解决方案,这可能会在上面的代码中引起一些其他问题
答案 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命令。这意味着您将在更新后返回记录。在您的查询中它只触发更新查询。也许尝试将其放在存储过程上,并在更改后选择更新的记录。