.net nhibernate sql-server-2012 bigdecimal

.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.