SQL错误:关键字“User”附近语法不正确。

50

我正在使用C#通过SQL将数据插入到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();
    }

执行命令时我遇到了以下错误:

关键字'User'附近语法不正确:INSERT INTO User (login, password, status) VALUES (@login, @password, @status)

请问我该如何解决这个问题?

编辑:已添加漏掉的参数值。

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

1
这怎么可能是C#错误?听起来像是SQL错误。 - CodesInChaos
@CodeInChaos - 重新标记了一下,好些了吗? - Marc Gravell
@Marc,我在谈论主题而不是标签。 - CodesInChaos
可能是简单的SELECT语句出现语法错误,为什么?的重复问题。 - Jodrell
4个回答

123

User是保留字,因此你必须使用方括号来明确表示你指的是名为“User”的对象,即使用[User]代替User


9

User是一个T-SQL 保留关键字。将其用方括号括起来即可解决问题,例如:INSERT INTO [User]


3

运行查询并与数据库交互。您可以使用declare sql关键字定义变量并赋值。如果您需要确定变量的值,请在conn.Open处设置断点,然后使用局部窗口查看传递的值。另一个可用工具是Sql Profiler。您可以启动跟踪,然后运行程序。在您发布的代码之后,您应该能够在配置文件中看到执行的查询。

所有这些都应该帮助您找出当异常没有提供足够信息时sql有什么问题。

Sql Server Management Studio应该已经突出显示了您sql语句中的User关键字,很容易显示您需要像这样加上括号:[User]。


同意。当人们在SSMS之外编写查询时,我总是感到惊讶,尽管它并不完美,但这是一个非常好的工具。特别是如果你启用了像stats-IO和actual-query-plan这样的选项。 - Marc Gravell
"Sql Server Management Studio 应该在您的 SQL 语句中突出显示 User 关键字,轻松显示您需要像这样加上括号:[User]。我同意这一点。或者 VS 应该指出它。" - Muneer
@Muneer - 除非你编写一个插件,否则对于Visual Studio来说,那是一个不透明的字符串。 - Marc Gravell
@Marc - 在Visual Studio中,并非所有的字符串都是不透明的,比如在F#中与printf和friends一起使用的字符串。它会在格式说明符和参数之间进行类型检查,如果它们不匹配,它将抛出编译器错误。 - Charles Lambert
@Muneer - 虽然这会很好,但 C# 编辑器实际上无法预测在执行之前您将如何使用该 SQL 语句。因此,它无法生成编译器错误。它只是将其发送到 SQL Server 并报告 SQL Server 告诉您的内容。 - Charles Lambert
@Charles,实际上我怀疑在很多情况下它可能会做出一个启发式的猜测。我想知道是否应该尝试编写一个插件。 - Marc Gravell

1

User 是 SQL 的保留关键字。将其用方括号括起来即可解决此问题。例如:INSERT INTO [User]

很容易就能看出需要使用方括号,像这样:[User]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接