【问题标题】:SQL error: Incorrect syntax near the keyword 'User'SQL 错误:关键字“用户”附近的语法不正确
【发布时间】:2011-08-30 06:11:49
【问题描述】:

我正在使用 SQL 将数据插入到使用 C# 的 SQL 数据库文件中,如下所示。

    String cs = System.Configuration.ConfigurationManager.ConnectionStrings["connection1"].ConnectionString;
    SqlConnection conn = new SqlConnection(cs);
    String sql = "INSERT INTO User (login, password, status) " + 
            "VALUES (@login, @password, @status)";
    SqlCommand comm = new SqlCommand(sql, conn);

    comm.Parameters.Add("@login", System.Data.SqlDbType.VarChar);
    comm.Parameters.Add("@password", System.Data.SqlDbType.VarChar);
    comm.Parameters.Add("@status", System.Data.SqlDbType.Bit);

    try
    {
        conn.Open();
        Console.WriteLine(conn.ToString());
        comm.ExecuteNonQuery();
        conn.Close();
        return true;
    }
    catch (Exception ex)
    {
        throw (ex);
    }
    finally
    {
        conn.Close();
    }

执行命令时出现以下错误。

关键字附近的语法不正确 '用户'。:插入用户(登录, 密码,状态)值(@login, @密码,@状态)

请问我该如何解决?

编辑: 添加了错过的参数值..

    comm.Parameters["@login"].Value = this.Username;
    comm.Parameters["@password"].Value = this._password;
    comm.Parameters["@status"].Value = this.Status;

【问题讨论】:

标签: c# sql sql-server tsql reserved-words


【解决方案1】:

User is a reserved keyword,因此您必须使用方括号明确表示您的意思是名为“用户”的对象,即使用[User] 而不是User

【讨论】:

    【解决方案2】:

    用户是 t-sql reserved keyword。将它括在方括号中应该可以解决这个问题。例如 INSERT INTO [用户]

    【讨论】:

      【解决方案3】:

      对数据库运行查询。您可以使用 declare sql 关键字来定义变量并为其赋值。如果您需要计算变量值,请在 conn.Open 处设置断点,然后使用本地窗口查看您传入的值。您可以使用的另一个工具是 Sql Profiler。您可以开始跟踪,然后运行您的程序。在您发布的代码运行后,您应该能够看到在配置文件中执行的查询。

      当异常没有提供足够的信息时,所有这些都可以帮助你找出你的 sql 出了什么问题。

      Sql Server Management Studio 应该在您的 sql 语句中突出显示 User 关键字,轻松表明您需要将其括起来,如下所示:[User]

      【讨论】:

      • 同意。当人们在 SSMS 之外编写查询时,它总是让我感到惊讶,这(虽然并不完美)是一个很好的工具。特别是如果您启用 stats-IO 和实际查询计划等选项。
      • "Sql Server Management Studio 应该在您的 sql 语句中突出显示 User 关键字,轻松表明您需要将其括起来,如下所示:[User]" 我同意这一点。或者VS应该指出来。
      • @Muneer - 好吧,除非您编写插件,否则对于 Visual Studio 来说这是一个不透明的字符串。
      • @Marc - 并非所有字符串在 Visual Studio 中都是不透明的,例如与 printf 和 f# 中的朋友一起使用的字符串。它会在其格式说明符和参数之间进行类型检查,如果它们不匹配,则会引发编译器错误。
      • @Muneer - 虽然它会很好,但 C# 编辑器实际上没有任何方法可以在您到达执行点之前预测您将如何使用该 sql 语句。因此它不会产生编译器错误。它只是将它发送到 sql server 并报告 sql server 告诉你的内容。
      【解决方案4】:

      User 是 sql 保留关键字。将它括在方括号中应该可以解决这个问题。例如INSERT INTO [User]

      很容易显示你需要像这样的括号:[用户]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-12
        • 2018-08-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多