cmd.executeNonQuery() 更新

Posted

技术标签:

【中文标题】cmd.executeNonQuery() 更新【英文标题】:cmd.executeNonQuery() Update 【发布时间】:2012-04-15 14:11:41 【问题描述】:

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

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

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)" 它可以工作。关于 Password 的一些东西会引发该错误。

【问题讨论】:

你有什么错误信息? UPDATE 语句中的语法错误。 【参考方案1】:

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

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

【讨论】:

+1 这是正确的答案。但是,该代码效率有点低。 (没有出口...)。更不用说密码是否包含单引号...... 完美。我怀疑这将是问题,但并没有真正考虑清楚。谢谢【参考方案2】:

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

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

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

【讨论】:

我在上面的评论中说明了错误。我确实有 con.Open() 但我没有发布它。 UserID 是自动编号,所以这不是问题。感谢您尝试提供帮助。 好的,然后将 Row.Item(0) 转换为字符串 ....CStr(Row.Item(0)),因为您不能将字符串附加到 int【参考方案3】:

我可能会在执行发生之前检查 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。

【讨论】:

确实很难让 SQL 注入与 MS Access 一起工作。 Access 将只允许执行一条语句,因此所有常用方法都行不通。我可以理解需要宣传SQL注入,但只有在OP更改数据库时才会相关。 并非如此。仅仅因为你被限制在一个陈述中并不意味着没有很多其他的攻击可用。例如,如果他们这样做是为了更新密码,我确信登录代码看起来非常相似:SELECT * FROM Users WHERE userID = 1 AND [Password] = xxx。注入类似这样的东西变得非常容易:' OR 1=1 作为密码。现在您无需密码即可登录。第一个帐户很可能是管理员帐户。使用参数很容易避免这种情况,不使用它们几乎没有意义。

以上是关于cmd.executeNonQuery() 更新的主要内容,如果未能解决你的问题,请参考以下文章

SqlCommand操作数据库

Ado.net[登录,增删改查,Get传值,全选,不选,批量删除,批量更新,添加]

无法从表中显示最大工资(测试)

C#中怎么怎么获取插入的新纪录的自增的id号

asp.net 如何一次执行多条件Sql语句,如何解决?

使用 npgsql 在 c# 中插入