4

我需要使用高精度的十进制值 - 例如,SQL Server 2012最多允许 38 位

这比System.Decimal支持的精度更高(28-29 位有效数字)。

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

这些值使用适当的 SQL Serverdecimal类型存储在 SQL Server 数据库中。

我正在为 ORM 使用 NHibernate。我正在尝试创建一个IUserType从 DB 表示转换为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 层的限制——据我所知,它也没有定义DbType适合 m 用例。

4

1 回答 1

1

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

如果您在阅读器上使用例如 GetValue(),通过类型映射表,您将获得System.Data.SqlTypes.SqlDecimal的实例。

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

于 2013-01-19T09:20:07.220 回答