【问题标题】:How to sort "Syntax error in insert into statement"如何对“插入语句中的语法错误”进行排序
【发布时间】:2019-01-26 15:52:57
【问题描述】:

对于我的计算机科学项目,我正在使用 Microsoft 访问数据库来使用 Windows 窗体在 Visual Basic 中创建一个测验应用程序。我所有的选择语句(使用 oledb 连接到数据库)都能正常工作;但是这个插入语句总是抛出“插入语句中的语法错误”,但据我所知,它没有任何问题。有问题的表称为“用户”,字段为“用户 ID”、“名字”、“姓氏”、“用户名”、“密码”、“教师”;其中 UserID 是自动编号,teacher 是布尔值,其余是字符串。

当我完成后,密码将被散列,但这样更容易测试它们还没有。

我已经尝试为 UserID 输入值,即使它应该在输入新记录时自动增加一个值。以及创建插入命令的几种不同方法。

Using oCmd As New OleDbCommand("Insert Into Users(FirstName, LastName, Username, Password, Teacher) 
    Values(@firstName, @lastName, @username, @password, 0)", myConnection)
    oCmd.Parameters.Add("@firstName", OleDbType.VarChar, 255).Value = txtFirstName.Text
    oCmd.Parameters.Add("@lastNamee", OleDbType.VarChar, 255).Value = txtLastName.Text
    oCmd.Parameters.Add("@username", OleDbType.VarChar, 255).Value = txtUsername.Text
    oCmd.Parameters.Add("@password", OleDbType.VarChar, 255).Value = txtPassword.Text
    oCmd.ExecuteNonQuery()
End Using

'txt...'.Text 是文本框,用户可以在其中输入他们想要的值的字符串,myConnection 是到数据库的连接,该连接已经从其他已运行和终止的命令打开。我希望在用户表中创建一条新记录,并在文本框中输入值;但它只是抛出上述错误。

【问题讨论】:

  • 我猜测用户和 ( 以及 VALUES 和 ( 之间缺少空格。调试 sql 字符串以查看输出 - 通常,一旦你这样做,问题就很明显了
  • 我怀疑False 无效。 0 有效吗? (True 将是 -1。)另外,你真的应该使用 SQL 参数来传递值,否则它可能会出错。
  • IDK 谁告诉你的?语法不区分大小写?
  • SQL Injection alert - 您应该将您的 SQL 语句连接在一起 - 使用 参数化查询 来避免 SQL 注入 - 查看Little Bobby Tables
  • 密码应该永远保存为纯文本。它们必须加盐和散列

标签: sql vb.net oledb insert-into


【解决方案1】:

您的 SQL 命令不起作用的真正原因是因为 Password 应该用反引号 (`) 括起来,因为它是保留字符串。我过去也遇到过类似的问题,我花了很长时间才意识到自己的错误。

您还应该使用参数来避免 SQL 注入。最后,您的代码应如下所示:

Using oCmd As New OleDbCommand("INSERT INTO `Users` (FirstName, LastName, Username, `Password`, Teacher) VALUES (@FirstName, @LastName, @Username, @Password, 0)", myConnection)

oCmd.Parameters.Add("@FirstName", OleDBType.VarChar, 63).Value = txtFirstName.Text
oCmd.Parameters.Add("@LastName", OleDBType.VarChar, 63).Value = txtLastName.Text
oCmd.Parameters.Add("@Username", OleDBType.VarChar, 63).Value = txtUsername.Text
oCmd.Parameters.Add("@Password", OleDBType.VarChar, 63).Value = txtPassword.Text

添加参数时的63 用于描述 varchar 可以占用多少个字符。您应该将其更改为数据库中变量使用的数量。

【讨论】:

  • 其实是password,是保留字; user 是,但不是 users
  • 哦,而且 AddWithValue 是一个糟糕的建议:AddWithValue is EvilAddWithValue is evil! 等等。用不同的添加参数的方式更新你的答案可能会让你投赞成票;)
  • 我不知道这一点。谢谢你指出。我已经更新了我的答案以使用更好的参数添加
  • 我认为MySql中使用了反勾号。由于这是 OleDb 提供程序,我猜它是 Access,其中在保留字周围使用方括号。 [ ]
  • 您的意思是您使用 OleDb 连接到 SqlServer?为什么不使用原生提供者?
猜你喜欢
  • 2016-06-10
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
  • 2014-05-25
  • 1970-01-01
  • 1970-01-01
  • 2016-12-14
  • 2023-04-08
相关资源
最近更新 更多