【发布时间】:2012-07-26 16:18:34
【问题描述】:
我遇到了负小数问题。
在 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 这样设置价格时,它给出了这个错误:
在数字数据类型中转换 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);
【问题讨论】:
-
您将所有内容作为每个参数的字符串传递。馊主意。最好使用参数化查询(正如 Testujin 指出的那样)或确保将任何非字符串值作为文字传入(SQL 将根据列推断类型)。换句话说,去掉价格、税金和金额列参数周围的撇号(所以
{2}, {3}, {4}而不是'{2}','{3}','{4}') -
仍然只适用于正数。顺便提一句。 2. 代码部分是如何工作的,而 1. 不是.. 我真的厌倦了它
-
那么我假设您的列(价格、税金、金额)之一没有指定小数。检查以确保它们都没有被创建为 DECIMAL(#,0) 或 NUMERIC(#,0)。无论哪种方式,这些列都应该是 MONEY 数据类型。
-
谢谢!现在它的工作。问题是税是十进制的(3,2)我只是把它设为十进制(8,2)。我会将所有插入更改为参数化代码。
标签: c# sql sql-server