我需要使用高精度的十进制值 - 例如,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
。
答案 0 :(得分:1)
无需调用NHibernateUtil.Decimal.NullSafeGet()。相反,您应该使用IDataReader上可用的方法来获取值。
如果您使用例如阅读器上的GetValue(),type mapping table看起来您将获得System.Data.SqlTypes.SqlDecimal的实例。
然后你必须弄清楚如何将值转换为你的BigDecimal。