【问题标题】:SQL Server Numeric, can create but not update using C#SQL Server Numeric,可以使用 C# 创建但不能更新
【发布时间】:2016-07-05 17:10:54
【问题描述】:

只是一个简单的快速问题,我正在使用 Microsoft SQL Server 2014 Express,现在我有两个函数来创建记录和更新包含数值的记录。

由于某些未知原因,我可以使用小数点后大于 0 的数值(如 50.50)创建记录,但是,当尝试使用数值更新此记录时,它只是说我的语法是小数点后错误。所以 tl,dr (50.00 有效,50.50 或类似的东西,不)。

我现在的问题是:我做错了什么?

这是我的两个函数:

public static void UpdateProduct(int id, string name, decimal price)
{
    try
    {
        string query = "UPDATE dbo.Products SET Name = '" + name + "' , Price = " + price + " WHERE ProductID = " + id;

        SqlCommand command = new SqlCommand(query, connection);
        command.ExecuteNonQuery();
    }
    catch (SqlException e)
    {
        Console.WriteLine(e.Message);
    }
}

public static void AddProduct(string name, decimal price)
{
    string query = "INSERT INTO dbo.Products (Name, Price) VALUES (@name, @price)";

    SqlCommand command = new SqlCommand(query, connection);
    command.Parameters.AddWithValue("@name", name);
    command.Parameters.AddWithValue("@price", price);

    command.ExecuteNonQuery();
}

这是我为这个值创建的 SQL

create Table Products
(
    ProductID INT IDENTITY(1,1) PRIMARY key,
    Name VARCHAR(255) NOT NULL,
    Price NUMERIC(5,2) NOT NULL,
    Active BIT DEFAULT 1
);

【问题讨论】:

  • SQL 参数也适用于 UPDATE 查询(但请使用 Add 而不是 AddWithValue)。
  • 很简单。当像在 UPDATE 中那样将小数连接到字符串时,它会使用 ToString 方法转换为字符串。在您的语言环境中,ToString 方法生成一个字符序列,其中小数点由逗号表示。这会对您的 sql 文本造成严重破坏。解决方案很简单。像在 Add 中一样使用参数
  • 为什么你在一种方法中使用参数而不是另一种方法?您的 Update 方法是 sql 注入的教科书示例。您需要在访问 bobby 表之前参数化此查询。 bobby-tables.com

标签: c# sql-server syntax numeric


【解决方案1】:

在您的插入查询中,您使用查询参数,其中包括处理十进制值的正确格式。

在更新查询中,您使用字符串连接将小数添加到查询中。可以肯定的是,您当前的文化不是将小数点格式化为点而是逗号,从而导致语法不正确的查询。

所以你的任务

string query = "UPDATE dbo.Products SET Name = '" + name + "' , Price = " + price + " WHERE ProductID = " + id; 

会产生类似的字符串

UPDATE dbo.Products SET Name = 'somename' , Price = 50,5 WHERE ProductID = 3

代替

UPDATE dbo.Products SET Name = 'somename' , Price = 50.5 WHERE ProductID = 3

使用像插入一样的参数化查询,这个问题 - 以及许多你甚至没有注意到的潜在问题 - 将会消失。

【讨论】:

  • 现在使用带参数的更新对我来说非常有效,感谢您的帮助。
猜你喜欢
  • 2021-04-15
  • 2020-07-23
  • 1970-01-01
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
  • 2013-12-13
相关资源
最近更新 更多