1

我有一个程序,用户可以通过在文本框中输入旧密码并在单独的文本框中输入新密码来更新密码。

然后更新查询使用新密码更新数据库。

Try
            If tbOldPassword.Text <> "" Then
                For Each Row In ds.Tables("sqlAddNewDetails").Rows
                    If Row.Item(0) = gblstrUserID Then
                        If Row.Item(1) = tbOldPassword.Text Then
                            If tbPassword.Text = tbRePassword.Text Then

                                'Updates the database
                                sqlUpdate = ("UPDATE Users SET Password = '" & tbPassword.Text & "' WHERE userID = " & Row.Item(0))
                                Dim cmd As New OleDbCommand(sqlUpdate, con)
                                cmd.ExecuteNonQuery()
                                MsgBox("Password successfully changed")
                            Else : MsgBox("The passwords are not the same")
                            End If
                        Else : MsgBox("Invalid old password")
                        End If
                    End If
                Next
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

但是,每次代码到达 cmd.ExecuteNonQuery() 时,它都会抛出一个错误,指出更新查询中存在语法错误。但是,如果我在 Microsoft Access 中使用此查询,它可以正常工作,因此更新查询本身可以正确编写。有什么问题?

注意:我在同一个 Sub 例程中的另一段代码中使用 UPDATE 查询,它在那里工作。它与此查询有关。

再次注意:如果我将更新查询更改为 UPDATE Users SET EMAIL = '" & tbPassword.Text & "' WHERE userID = " & Row.Item(0)" 它可以工作。关于密码的一些东西会引发该错误。

4

3 回答 3

4

密码是一个关键字,所以用方括号括起来,如下所示,

UPDATE Users SET [Password] =.....

于 2012-04-15T14:41:25.713 回答
1

我必须看到错误消息,直到我注意到两件事:

1 - con.Open() 不存在!!!,它可能没有打开 2 - 在查询中如果 UserId 是一个数字,那么查询字符串应该是: "' WHERE userID = " & CStr(Row.Item(0))

如果 UserID 是字符串,则查询字符串应为: "' WHERE userID = '" & Row.Item(0) & "'"

于 2012-04-15T14:21:00.410 回答
1

在执行发生之前,我可能会检查 sqlUpdate 变量包含的内容。它可能不包含您认为的内容。我会复制字符串值并将其粘贴到 SQL Server Management Studio 中,然后尝试直接运行它来验证它。

话虽如此,我真的不会使用字符串连接来编写这段代码。您正在向 SQL 注入攻击敞开大门。如果用户的密码中有单引号会发生什么?请改用 SQL 参数,如下所示:

sqlUpdate = "UPDATE Users SET Password = ? WHERE userID = ?"
cmd.Parameters.Add(tbPassword.Text)
cmd.Parameters.Add(Row.Item(0))

嗯...我也可能不会使用 OleDb。我会使用本机客户端。

当然,我必须链接到经典的XKCD Bobby Tables

于 2012-04-15T14:55:41.937 回答