2

我有负小数的问题。

在我定义price为的 SQL Server 数据库中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它给出了这个错误:

在数字数据类型中转换 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);
4

2 回答 2

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();
于 2012-07-26T16:22:14.677 回答
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);

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

于 2012-07-26T16:52:07.427 回答