2013-03-26 3 views
0

데이터베이스 액세스 권한이 있으며이 필드 중 하나가 배정 밀도를 사용합니다. 일반적으로 텍스트 상자에 1.71 또는 1,71을 설정하면 데이터베이스의 필드에 1.71이 포함되어야합니다.C에서 double 형식의 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 양식, 웹 양식, MVC, WPF 등을 사용하고 있습니까? –

+1

... '비용'은 통화/화폐 가치를 포함 할 필드입니까? 그렇다면 이중 정밀도 필드와 같은 것을 사용해서는 안됩니다. 특히 0.1을 정확하게 표현할 수 없습니다 (10 회 더 합치면 정확히 1.0이되지 않습니다).). 표준은 소수점 이하의 숫자를 사용하고, DB가 지원한다면 돈형을 사용하는 것입니다. –

+0

십진수를 사용하는 경우 +1입니다. –

답변

2

double.Parse은 기본적으로 현재 스레드의 문화권을 사용합니다. I 용의자 현재 문화권에서 "." 그룹 구분 기호로 사용됩니다.

두 가지 옵션 :

  • 이미하고있는로 Replace를 사용하지만,
  • 가 교체를 제거 구문 분석 할 때 다음 CultureInfo.InvariantCulture를 지정하고 원래 값을 구문 분석 할 때 단지 현재의 thread의 문화를 계속 사용합니다. 이것은 사용자에게 적합한 문화에 의존하지만, 더 나은 해결책 일 수 있습니다. (그들은 "1234보다 조금"의 값을 예상 할 때 그렇지 않으면 입력 누군가가 "1,234.56"구문 분석 오류가 발생합니다.)
0

내가 창에 올바르게 기억하면 텍스트 상자에 이중 속성을 바인딩 할 수 있습니다 형성 파싱 ​​및 변환을 자동으로 처리합니다. 문자열에서 파싱을 수동으로해서는 안됩니다.

그 문제는 이미 .NET 프레임 워크에서 해결되었습니다.

또 다른 제안은 데이터 액세스 코드가 구문 분석을해서는 안됩니다. 그것은 어떤 상위 계층에서 이루어져야합니다. 그러나 프레임 워크에 맡기는 것이 좋습니다.