2013-03-26 65 views
0

我有一個數據庫訪問,並且這個字段之一是雙精度。 通常,如果我在文本框1.71或1,71中設置,數據庫中的字段應該包含1.71。如何轉換在c中的sql類型雙精度#

但是,如果我執行查詢acces'field的值是171 !!。

public const string QUERY = 
     @"UPDATE TBLART 
      SET TBLART.COST = @cost 
      WHERE TBLART.CODE= '1'"; 

var param = new DynamicParameters(); 
var cost = totalCost.Replace(',', '.'); //totalCost is a textbox 
param.Add("cost", Double.Parse(cost), DbType.Double); 

gsmconn.Execute(QUERY, param); 

我錯了什麼?謝謝。

+0

您正在使用Windows窗體,Web窗體,MVC,WPF,...? – 2013-03-26 18:29:49

+1

...「Cost」是一個包含貨幣/貨幣價值的字段嗎?如果是這樣,你不應該使用類似雙精度字段的東西 - 除此之外,它們不能準確地表示'0.1'(如果將它加在一起10次,通常不會得到'1.0',通常)。標準是至少使用十進制/數字,如果數據庫支持,則使用金錢類型。 – 2013-03-26 18:54:40

+0

使用十進制+1。 – 2013-03-26 19:06:38

回答

2

double.Parse默認使用當前線程的文化。我嫌犯你目前的文化使用「。」作爲分組分隔符。

兩個選項:

  • 繼續使用Replace因爲你已經在做,但後來在解析時
  • 取出更換指定CultureInfo.InvariantCulture,並解析原始值時只使用當前線程的文化。這依賴於適合用戶的文化,但在這種情況下可能是更好的解決方案。 (否則有人進入「1,234.56」會當他們預計「只是有點比1234更值」得到了解析錯誤。)
0

如果我沒有記錯的Windows窗體中,你可以將雙屬性綁定到一個文本框它會自動處理分析和轉換。您不應該手動從字符串進行解析來翻倍。

這個問題已經由.NET框架解決了。

另一個建議,你的數據訪問代碼不應該做任何解析。這應該在更高層完成。但最好把它留給框架。

相關問題