2013-01-18 141 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數據庫中。

我使用NHibernate for ORM。我正在嘗試創建一個IUserType實現,該實現將數據庫表示轉換爲BigDecimal表示形式。

我的問題是,我不知道如何做到這一點,而不使用將截斷數據的中間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; 
} 

更新:

在Java對口,我可以看到一個特殊的hibernate的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()試圖返回一個引發溢出異常的小數,它不是一個SQLDataReader,所以我不能調用.getSqlDecimal()。有什麼想法嗎? – Stu

+0

@Stu您是否正在使用Oracle,並且應該以更高的精度使用它們的類型? –

+0

我正在使用SQL Server。我得到的IDataReader是一個NHybridDataReader。 – Stu