cmd.executeNonQuery()更新

时间:2012-04-15 14:11:42

标签: .net vb.net ms-access

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

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

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()时,都会引发错误,指出Update查询中存在语法错误。但是,如果我在Microsoft Access中使用此查询,它可以正常工作,以便正确编写更新查询本身。可能有什么不对?

注意:我在同一个Sub例程中的另一段代码中使用UPDATE查询,它在那里工作。它是关于这个查询的东西。

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

3 个答案:

答案 0 :(得分:4)

密码是一个关键字,因此请将其包装在方括号中,如下所示

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分: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