2012-07-26 84 views
2

我遇到負數小數問題。在SQL Server小數點列中插入負值拋出錯誤

在我定義pricedecimal(8,2) NULL

一個SQL Server數據庫的代碼。我正在使用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那麼它給這個錯誤:

Arithmetic Overflow on converting varchar in numeric-datatype.

做什麼我需要做在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

您將每個參數的字符串傳遞給EVERYTHING。餿主意。更好的方法是使用參數化查詢(如Testujin指出的那樣),或者確保任何非字符串值都以文本形式傳入(SQL將根據列推斷出該類型)。換句話說,在您的價格,稅金和金額欄參數(例如'{2},{3},{4}',而不是'{2}','{3}','' {4}'') – SPFiredrake 2012-07-26 16:35:40

+0

仍然只適用於正數。順便說一句。 2.代碼部分的工作原理和1.一個不..我真的很厭倦 – 2012-07-26 16:41:35

+1

然後,我假設你的一列(價格,稅收,金額)沒有指定小數。檢查以確保它們都不是以DECIMAL(#,0)或NUMERIC(#,0)創建的。無論哪種方式,這些列應該是MONEY數據類型。 – SPFiredrake 2012-07-26 16:44:35

回答

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); 

一定要小心,如果你傳遞一個字符串,它必須執行的DB側的轉換,如果不能轉換它可以失敗。更好的做法是獲取強類型值(換句話說,解析數量以確保它們是有效的),然後將這些值傳遞給參數。

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(); 
+0

我已經更新了我的問題 – 2012-07-26 16:28:26

+0

你可以舉個例子嗎? – 2012-07-26 16:31:26

+1

'INSERT INTO票據(ticket_id,product_name,price,tax,amount)VALUES(@ticket_id,@ product_name,@price,@tax,@amount)',然後在你的SQL命令對象上,你做'sqlCommand.Parameters。添加(「@ ticket_id」,ticket_id); sqlCommand.Parameters.Add(「@ product_name」,pro2.ProductName); ......爲你的所有參數。 – SPFiredrake 2012-07-26 16:42:53