【问题标题】:I keep getting an error 'Incorrect syntax near the keyword 'VALUES'.' [closed]我不断收到错误消息“关键字“VALUES”附近的语法不正确。” [关闭]
【发布时间】:2020-08-07 04:29:37
【问题描述】:

我正在尝试用 C# 更新我的数据库,但我不断收到此消息错误

System.Data.SqlClient.SqlException: '关键字'VALUES'附近的语法不正确。'

这是我更新数据库的代码:

public void updateTheStack(string name, int quant)
{
        connect.Open();

        SqlCommand cmd = new SqlCommand("UPDATE Items ('Quantity') VALUES (@Quantity) WHERE Name = @Name", connect);

        cmd.Parameters.AddWithValue("@Quantity", quant);
        cmd.Parameters.AddWithValue("@Name", name);

        SqlDataReader reader = cmd.ExecuteReader();

        connect.Close();
}

还有我的数据库:

我认为这一定是我的查询有误。

【问题讨论】:

  • Official Docs 应该始终是您的第一个停靠港。
  • 由于您的UDPATE 没有返回任何结果集,您应该使用ExecuteReader(),而是使用ExecuteNonQuery() .....

标签: c# .net sql-server


【解决方案1】:

这是一个直截了当的语法问题,看起来您将 UPDATE 与 INSERT 的典型模式混淆/混淆了

典型更新:

UPDATE table 
SET column = value, column2 = value2 
WHERE othercolumn = othervalue

典型插入:

INSERT INTO table (column, column2) VALUES (value, value2)

我知道你用 UPDATE 的新语法去哪里了;)但这只是“你必须记住它们是这样的”


附注,你应该阅读http://dapper-tutorial.com - 你的生命太短了,不能编写像这样费力、重复、无聊的数据库访问代码

【讨论】:

    【解决方案2】:

    你的update query不正确,语法是be

    UPDATE table_name   //table_name is Items
    SET column1 = value1, column2 = value2, ...   //column1 is Quantity
    WHERE condition;      //Condition is Name = @name
    

    你的代码看起来像,

    public void updateTheStack(string name, int quant)
    {
        connect.Open();
    
        SqlCommand cmd = new SqlCommand("UPDATE Items SET Quantity = @Quantity  WHERE Name = @Name", connect);
    
        cmd.Parameters.AddWithValue("@Quantity", quant);
        cmd.Parameters.AddWithValue("@Name", name);
    
        var recordCount = cmd.ExecuteNonQuery();
    
        connect.Close();
    }
    

    正如@marc_s 所说,更新查询不返回任何结果集,您应该使用ExecuteNonQuery() 而不是ExecuteReader()

    针对连接执行 Transact-SQL 语句并返回 受影响的行数。

    【讨论】:

    • 由于您的UDPATE 没有返回任何结果集,您应该使用ExecuteReader(),而是使用ExecuteNonQuery() .....
    • 当人们对 SQL Server 使用带有 参数化查询 的 AddWithValue 时,最好指出他们阅读 this blog,但如果他们使用存储过程或非sqlserver数据库,我不提了
    • @CaiusJard,感谢您的参考,我会先阅读此博客并相应更新我的答案。
    • 没有问题! ps;我没有在存储过程中提及它的原因是它不是一个问题,因为参数类型是在 sqlserver 端声明的而不是推断的。我没有在非 SQLS 数据库中提及它的原因是因为它并不总是很重要,并且一些例如 MySQL 积极推荐使用它。我看到人们甚至对提到 AddWithValue 的答案投了反对票,这很荒谬;我更喜欢整个世界的参数化查询,即使是通过 AWV,因为它会杀死 SQL 注入黑客。由于类型推断错误而导致查询运行缓慢的问题远不如注入问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    相关资源
    最近更新 更多