【问题标题】:VB.net Access Update QueryVB.net Access 更新查询
【发布时间】:2013-07-29 13:27:23
【问题描述】:

VB.net 访问更新查询在更新查询错误中给出语法错误。我的查询如下:

query = "UPDATE users SET username='" & newUsername & "', password='" & newPassword & "', department='" & newDepartment & "', display_name='" & newDisplayName & "', email='" & newEmail & "', extension='" & newExtension & "', access_level='" & newAccessLevel & "' WHERE id=" & usrID

以上变量都没有任何符号。我做错了什么?

::更新::

UPDATE users SET username='alison', password='farm1234',department='1',display_name='Alison *****', email='production@**********.com', extension='1012',access_level='50' WHERE id=1

这就是查询的运行方式。

【问题讨论】:

  • 您做错的第一件事是将自己暴露于 SQL 注入攻击...谷歌它...接下来您可能要做的就是实际运行该代码,然后准确地告诉我们变量查询...
  • 我真的不担心 SQL 注入,因为这家公司只有大约 15 个人在我们的总部办公,没有人对此了解太多。我在其他时间使用准备好的语句进行 SELECT 查询,但这更快。此外,您需要先登录,它使用准备好的语句。更新见上文。
  • 永远不要假设您知道系统将被谁使用。始终安全编码。您所需要的只是某个经理决定将其推广到更广泛的范围,然后您突然拥有了一个具有根本缺陷的关键任务软件包。哦 - 让他们通过参数化查询登录是没有防御的......您假设他们想要通过登录?如果只是想用其他人友好/愚蠢地登录的机器删除表怎么办......

标签: vb.net ms-access


【解决方案1】:

该错误是由于使用了保留关键字 PASSWORD 而未将其括在方括号中。

也就是说,您从不使用字符串连接来构建 sql 命令,而是始终使用参数化查询来避免 Sql Injection 问题,以及在解析文本值(包含单引号)或带有小数分隔符或日期值的十进制值时出现语法错误。

所以,你的任务可能的方法是

query = "UPDATE users SET username=?, [password]=?, department=?, " & _
        "display_name=?, email=?, extension=?, access_level=?" & _
        " WHERE id=?"

Using cmd = new OleDbCommand(query, connection)
   cmd.Parameters.AddWithValue("@p1", newUsername)
   cmd.Parameters.AddWithValue("@p2", newPassword)   
   cmd.Parameters.AddWithValue("@p3", newDepartment)   
   cmd.Parameters.AddWithValue("@p4", newDisplayName)
   cmd.Parameters.AddWithValue("@p5", newEmail)
   cmd.Parameters.AddWithValue("@p6", newExtension)
   cmd.Parameters.AddWithValue("@p7", newAccessLevel)   
   cmd.Parameters.AddWithValue("@p8", usrID)
   cmd.ExecuteNonQuery()

End Using

请记住,OleDb 不使用参数名称在 sql 命令文本中查找相应的占位符。相反,它使用位置级数,因此将参数添加到集合中应该遵守参数在 sql 命令文本中出现的顺序

【讨论】:

  • 见我上面的评论。我想重新阅读后,我的评论不适用。好吧,我需要知道无论如何都必须附上密码。
【解决方案2】:
   ConStr()
    Qry="UPDATE users SET username=@uname, [password]=@pass, department=@dept, " & _
            "display_name=@dnam, email=@email, extension=@ext, access_level=@acslvl" & _
            " WHERE id=@id"
    cmd = new oledbcommand(Qry,Conn)
    cmd.Parameters.AddWithValue("@uname",newUsername)
    cmd.Parameters.AddWithValue("@pass",newPassword)
    cmd.Parameters.AddWithValue("@dept",newDepartment)
    cmd.Parameters.AddWithValue("@dnam",newDisplayName)
    cmd.Parameters.AddWithValue("@email",newEmail)
    cmd.Parameters.AddWithValue("@ext",newExtension)
    cmd.Parameters.AddWithValue("@acslvl",newAccessLevel)
    cmd.Parameters.AddWithValue("@id",usrID)
    cmd.ExecuteNonQuery()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多