将负值插入SQL Server十进制列会引发错误

时间:2012-07-26 16:18:35

标签: c# sql sql-server

我遇到负十进制问题。

在SQL Server数据库中,我将price定义为decimal(8,2) NULL

以及我在C#中使用的代码:

string query = string.Format("INSERT INTO ticket_elements " +
                             "(ticket_id, product_name, price, tax, amount) " +
                             VALUES ({0}, '{1}', '{2}', '{3}', '{4}'); SELECT SCOPE_IDENTITY();",
                                 ticket_id, pro2.ProductName, tPrice, tax, fixedAmountStr);

如果{2}价格也不是负值,那么它的工作正常,但当我设置价格-0.25时,它会给出此错误:

  

在numeric-datatype中转换varchar时的算术溢出。

在db中使用负值需要做什么?

更新

但以下代码只能正负值或正值。

我真的很困惑。

string query = string.Format("INSERT INTO tickets " +
                             "(registration_date, cancellation, cancellation_date,    total_products, total_gross_price, total_net_price, pay_type, user_id, client_id)" +
                             " VALUES ('{0}', '{1}', '{2}', '{3}', '{4}',  '{5}', '{6}', {7}, {8});" +
                             " SELECT SCOPE_IDENTITY();", regData, "False", "", this.TotalProducts, totalGrossPrice, totalNetPrice, this.PayType, this.CashierId,  this.ClientId);

2 个答案:

答案 0 :(得分:4)

不要使用string.format来创建查询。请改用参数化查询。

对于SQL Server:

var aDbCommand = connection.CreateCommand();
aDbCommand.CommandText = "insert into myTable(column1,columns2) values (@param1, @param2)";
aDbCommand.Parameters.Add(new SqlParameter{Name="@param1", SqlDbType=SqlDbType.Decimal, Value = aValue});
aDbCommand.Parameters.Add(new SqlParameter{Name="@param2", SqlDbType=SqlDbType.Decimal, Value = aValue});
aDbCommand.Execute();

答案 1 :(得分:2)

使用参数化查询。它可以帮助您免受注入攻击,并且实际上可以更快地通过硬编码值传递直接SQL(因为服务器可以缓存已编译的参数化查询并仅发送值)。这就是你的方式:

string query = "INSERT INTO ticket_elements " +
"(ticket_id, product_name, price, tax, amount) " +
"VALUES (@ticket_id, @product_name, @price, @tax, @amount);" + 
"SELECT SCOPE_IDENTITY();",
// Instantiate SqlCommand object with above query.
sqlCommand.Parameters.Add("@ticket_id", ticket_id);
sqlCommand.Parameters.Add("@product_name", pro2.ProductName);
sqlCommand.Parameters.Add("@price", tPrice);
sqlCommand.Parameters.Add("@tax", tax);
sqlCommand.Parameters.Add("@amount", fixedAmountStr);

请注意,如果传入字符串,则必须在数据库端执行转换,如果无法转换,则可能会失败。更好的做法是获取强类型值(换句话说,解析金额以确保它们有效),然后将这些值传递给参数。