我遇到负十进制问题。
在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);
答案 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);
请注意,如果传入字符串,则必须在数据库端执行转换,如果无法转换,则可能会失败。更好的做法是获取强类型值(换句话说,解析金额以确保它们有效),然后将这些值传递给参数。