2013-01-18 1 views
4

SQL Server 2012 allows for up to 38 digits과 같이 고정밀 도로 십진수 값을 사용해야합니다..NET, SQL Server, NHibernate 및 고정 소수점 이하 자릿수

이 값은 System.Decimal이 지원하는 정확도 (28-29 significant digits)보다 정확합니다.

BigDecimal의 특정 구현을 사용하여 필요한 모든 생성자 (예 : 숫자의 문자열 표현)를 지원하는 CLR 측에서이를 표현한다고 가정 해 보겠습니다.

값은 적절한 SQL Server decimal 유형을 사용하여 SQL Server 데이터베이스에 저장됩니다.

나는 ORM을 위해 NHibernate를 사용하고 있습니다. DB 표현에서 BigDecimal 표현으로 변환하는 IUserType 구현을 만들려고합니다.

제 문제는 데이터를 자르지 않는 중간 System.Decimal을 사용하지 않고이를 수행하는 방법을 알아낼 수 없다는 것입니다.

public virtual object NullSafeGet(IDataReader rs, string[] names, object owner) 
{ 
    // ?? 
    object objValue = NHibernateUtil.Decimal.NullSafeGet(rs, names[0]); 
    //objValue is already a System.Decimal 

    if (!Convert.IsDBNull(objValue)) 
    { 
     return new BigDecimal(objValue.ToString()); 
    } 
    return null; 
} 

업데이트 :

자바 대응에

, 나는이 정확한 사용 사례에 대한 특별한 최대 절전 모드 DbType과를 볼 수 있습니다 org.hibernate.type.BigDecimalType

을 나는이 기본의 한계가 궁금 시작 했어 ADO.NET 레이어 - 그것은 내가 말할 수있는 한 m 사용 사례에 적합한 defined DbType도 없습니다.

답변

1

NHibernateUtil.Decimal.NullSafeGet()을 호출 할 필요가 없습니다. 대신 IDataReader에서 사용할 수있는 메서드를 사용하여 값을 가져와야합니다.

예 : GetValue()를 type mapping table으로 지정하면 System.Data.SqlTypes.SqlDecimal이라는 인스턴스가 생성됩니다.

그런 다음 값을 BigDecimal로 변환하는 방법을 알아야합니다.

+1

작동하지 않습니다. getValue()는 .getSqlDecimal()을 호출 할 수 없으므로 SQLDataReader가 아니며 오버플로 예외를 발생시키는 십진수를 반환하려고합니다. 이견있는 사람? – Stu

+0

@Stu 오라클을 사용하고 있으며 더 정밀도가 높은 유형을 사용해야합니까? –

+0

SQL Server를 사용하고 있습니다. IDataReader는 NHybridDataReader입니다. – Stu