.NET,SQL Server,NHibernate和高精度小数

时间:2013-01-18 15:33:30

标签: .net nhibernate sql-server-2012 bigdecimal

我需要使用高精度的十进制值 - 例如,SQL Server 2012 allows for up to 38 digits

这比System.Decimal支持的更精确(28-29 significant digits)。

假设我使用BigDecimal的某个实现在CLR端表示它,它支持任何所需的构造函数(例如,从数字的字符串表示形式)。

使用适当的SQL Server decimal类型将值存储在SQL Server数据库中。

我正在使用NHibernate进行ORM。我正在尝试创建一个{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;
}

更新

在Java版本中,我可以看到针对这个确切用例的特殊Hibernate DbType:org.hibernate.type.BigDecimalType

我开始怀疑这是否是底层ADO.NET层的限制 - 据我所知,它也没有适用于m用例的defined DbType

1 个答案:

答案 0 :(得分:1)

无需调用NHibernateUtil.Decimal.NullSafeGet()。相反,您应该使用IDataReader上可用的方法来获取值。

如果您使用例如阅读器上的GetValue(),type mapping table看起来您将获得System.Data.SqlTypes.SqlDecimal的实例。

然后你必须弄清楚如何将值转换为你的BigDecimal。