【问题标题】:SQL syntax error in Update statement VB.net更新语句 VB.net 中的 SQL 语法错误
【发布时间】:2012-09-26 02:02:28
【问题描述】:

当我在 VB 中运行时遇到一个奇怪的语法错误:

        SQLString = "UPDATE Login SET Password = '" + PasswordTextBox.Text + "'"
        SQLString += " WHERE UserName = '" + UserNameTextBox.Text + "'"

Username 在进入这部分之前会被检查,并且肯定在数据库中。 它给出了一个异常,指出更新语句中存在语法错误。有谁知道怎么回事?

【问题讨论】:

  • 例如,如果用户名包含撇号,您将收到语法错误。无论如何,您应该使用参数化查询。

标签: sql vb.net sql-update oledb


【解决方案1】:

LOGIN 是 SQL Server 中的保留字(用于登录帐户管理),因此为了在查询中使用它(即列名),您需要使用 [] 对其进行转义,因此使用 @987654326 @ 作为字段名。

您不应该使用字符串连接并将其传递给您的 SQL 数据库,因为您将自己暴露在SQL Injection 攻击中。

您应该使用 SqlCommand 对象并传递参数。请参阅this article 了解如何操作。

SQLString = "UPDATE [Login] SET Password = @password "
SQLString += " WHERE UserName = @userName"

...

dbCommand.Parameters.Add("@password", SqlDbType.VarChar, 50)
dbCommand.Parameters["@password"].Value = PasswordTextBox.Text

dbCommand.Parameters.Add("@userName", SqlDbType.VarChar, 50)
dbCommand.Parameters["@userName"].Value = UserNameTextBox.Text

【讨论】:

  • 这只是一个蹩脚的大学项目,没有必要阻止 SQLInjection,因为它无论如何也看不到曙光。
  • 非常正确,但他们说按照他们的方式去做,所以我不能反对
【解决方案2】:

我很确定 Login 是保留字,请尝试将 Login 更改为 [Login]

【讨论】:

    【解决方案3】:

    密码是保留字,所以[密码]修复了它,我的讲师为我修复了:)

    【讨论】:

      【解决方案4】:

      与其展示如何构建语句,不如向我们展示执行语句时 SQLString 中的内容。

      此外,请尝试将列名和表名括在标识符引号字符中,对于 Microsoft,它们是 [ 和 ],对于许多其他数据库来说是 `(在波浪号键上)。

      【讨论】:

        【解决方案5】:

        在不知道您的实际密码和用户名使用什么的情况下,我的猜测是其中一个(或两个)中的某些字符导致 sql 语句过早结束。像这样执行sql的时候真的应该使用参数。

        看看这个:http://msdn.microsoft.com/en-us/library/ms998271.aspx

        【讨论】:

          【解决方案6】:

          我同意之前的一些答案,关于使用参数(我给@Oded + 1)和使用 [ ] 与表名和字段名(我给 SQLMenace +1)。

          最后,我认为这是启动查询的最正确方式:

          using(SqlConnection connection = new SqlConnection("<your connection string>"))
              {
                  connection.Open();
                  SqlCommand command = new SqlCommand();
          
                  command.Connection = connection;
          
                  command.CommandText = "UPDATE [Login] SET [Password] = @PasswordParameter WHERE [UserName] = @UserNameParameter";
                  command.Parameters.AddWithValue("@PasswordParameter", PasswordTextBox.Text);
                  command.Parameters.AddWithValue("@UserNameParameter", UserNameTextBox.Text);
          
                  command.ExecuteNonQuery();
              }
          

          【讨论】:

            【解决方案7】:

            我建议在“登录”和“密码”这两个词周围加上刻度线,让处理程序知道它们不会被呈现为保留字。

            所以:

            更新“登录”SET“密码”

            但不要使用单引号,而是使用刻度线(键盘上的左上键)。我无法正确演示它,因为如果 StackOverflow 被刻度线包围,它会将它视为一个类。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-11-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-09-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多