2014-12-19 1 views
1

rate이라는 십진수를 매개 변수 중 하나로 보내는 저장 프로 시저를 호출하려하지만 쿼리를 실행할 때 십진수 정밀도가 손실됩니다. exchangeRate.Rate0.0000631046입니다,이 시점에서SQL 쿼리에서 NHibernate 10 진수 정밀도

IQuery query = Session.CreateSQLQuery("exec SaveExchangeRate @Rate = :rate, @OtherParameter = :otherParameter"); 
query.SetDecimal("rate", exchangeRate.Rate); 
query.SetInt32("otherParamter", otherParamter); 
query.ExecuteUpdate(); 

:

은 서버 측 코드입니다.

나는 SQL 프로파일 러를 열고

, 나에게주고있다 :

exec sp_executesql N'exec SaveExchangeRate @Rate = @p0, @OtherParamter = @p1',N'@p0 decimal(28,5),@p1 int',@p0=6,@p1=4 

보시다시피, 정밀도는 decimal(28,5)하지만, 저장 프로 시저 내부에 필요한 정밀도 decimal(19,10)이고, 수는 SQL로 전송 데이터베이스는 정확도가 떨어지는 6입니다. 그 후, 지속 된 숫자는 0.0000600000이며 많은 소수를 잃습니다.

이 문제를 해결하려면 어떻게해야합니까?

+0

이 게시물을 본 적이 있습니까? http://stackoverflow.com/q/5243486/497356 –

+0

그래,하지만, 당신이 볼 수 있듯이, 값이 속성에서 왔기 때문에, 그것의 매핑되지 않습니다 – lante

답변

2

음이 전혀 간단하지 않습니다 거기에 더 나은 방법이 될 수도 있지만, 당신은 다음 SetParameter 대신 SetDecimal 사용 규모와 원하는 정밀도로 decimal 유형을 검색 할 수 TypeFactory을 사용할 수

IType decimalType = TypeFactory.Basic("Decimal(19,10)"); 

IQuery query = Session.CreateSQLQuery("...."); 
query.SetParameter("rate", exchangeRate.Rate, decimalType); 
query.SetInt32("otherParamter", otherParamter); 
query.ExecuteUpdate(); 

이것은 올바른 번호를 데이터베이스에 보내는 것 같습니다.

+0

작동, 감사합니다! – lante

+0

@lante : 물론 문제 없습니다. –