.NET, SQL Server, NHibernate y decimales de alta precisión
sql-server-2012 bigdecimal (1)
Necesito usar valores decimales con alta precisión, por ejemplo, SQL Server 2012 permite hasta 38 dígitos .
Esto es más precisión de lo que admite System.Decimal
( 28-29 dígitos significativos ).
Supongamos que utilizo una cierta implementación de BigDecimal
para representar esto en el lado de CLR que admite cualquier constructor necesario (por ejemplo, a partir de una representación de cadena del número).
Los valores se almacenan en la base de datos de SQL Server utilizando el tipo de decimal
SQL Server apropiado.
Estoy usando NHibernate para ORM. IUserType
crear una implementación de IUserType
que convierta de la representación de DB a la representación de BigDecimal
.
Mi problema es que no puedo entender cómo hacerlo sin el uso de un System.Decimal
intermedio que truncaría los datos.
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;
}
Actualizar:
En la contraparte de Java, puedo ver un Hibernate DbType especial para este caso de uso exacto: org.hibernate.type.BigDecimalType
Estoy empezando a preguntarme si esto es una limitación de la capa subyacente de ADO.NET; tampoco DbType
un DbType
definido apropiado para DbType
caso de uso, hasta donde sé.
No es necesario llamar a NHibernateUtil.Decimal.NullSafeGet (). En su lugar, debe usar los métodos disponibles en IDataReader para obtener el valor.
Si utiliza, por ejemplo, GetValue () en el lector, en la tabla de asignación de tipos parece que obtendrá una instancia de System.Data.SqlTypes.SqlDecimal .
Luego, tendrá que descubrir cómo convertir el valor a su BigDecimal.