type tipos tipo number net float datos dato data c# oracle nhibernate oracle10g nhibernate-mapping

c# - tipos - tipo de dato integer oracle



¿Qué tipo de datos.NET es mejor para mapear el NUMBER tipo de datos de Oracle en NHibernate? (3)

He visto decimal utilizado en lugar de int / largo en varios ejemplos. Solo estoy tratando de entender por qué

Probablemente se deba a que .NET decimal y Oracle NUMBER trazan un mapa mejor que long y NUMBER y también le dan más flexibilidad. Si en una etapa posterior agrega una escala en la columna Oracle, entonces no tendría que cambiar el tipo de datos si ya utilizó decimal .

decimal es ciertamente más lento que int y desde hace long ya que los dos últimos son compatibles con el hardware. Dicho esto, tienes que procesar una gran cantidad de datos para que haga una diferencia. Sigo pensando que deberías usar " long si eso es lo que estás tratando y luego también debes dejar que las definiciones de columnas de la tabla lo representen. NUMBER(18,0) por long y así sucesivamente.

La razón por la que decimal mapas decimal un poco mejores es que long es 64 bits y el decimal es (clase de) 128 bits.

.RED

Tipo: decimal
Rango aproximado: ± 1,0 × 10 ^ -28 a ± 7,9 × 10 ^ 28
Precisión: 28-29 dígitos significativos

Tipo: largo
Rango: -9,223,372,036,854,775,808 a 9,223,372,036,854,775,807
Precisión: 18 (19 por ulong) dígitos significativos

Oráculo

NUMBER defaults 38 dígitos significativos y escala 0 (entero).

Tipo: NUMBER
Rango: + - 1 x 10 ^ -130 a 9.99 ... 9 x 10 ^ 125
Precisión: 38 dígitos significativos

Microsoft es consciente del problema y las notas

Este tipo de datos es un alias para el tipo de datos NUMBER (38) y está diseñado para que OracleDataReader devuelva un System.Decimal u OracleNumber en lugar de un valor entero. El uso del tipo de datos .NET Framework puede causar un desbordamiento.

Ahora que lo pienso, realmente necesitas que BigInteger represente la misma cantidad de dígitos significativos que el NUMBER predeterminado. Nunca he visto a nadie hacer eso y supongo que es una necesidad muy rara. Además, BigInteger aún no lo cortaría, ya que NUMBER puede ser de infinito positivo y negativo.

He visto algunos ejemplos en los que se usa decimal en proyectos NHibernate para mapear columnas de números enteros en Oracle. En este momento estoy usando int y long en mi programa.

¿Cuáles son las ventajas de decimal sobre int / long ? ¿Funciona mejor?


NUMBER(1,0) => Boolean NUMBER(5,0) => Int16/short.MaxValue == 32767 NUMBER(10,0) => Int32/int.MaxValue == 2,147,483,647 NUMBER(19,0) => Int64/long.MaxValue == 9,223,372,036,854,775,807


[.NET: Int32] = [Oracle:NUMBER(2)..NUMBER(9)*] [.NET: Int64] = [Oracle:NUMBER(10)..NUMBER(18)*] [.NET: Double] = [Oracle:NUMBER(x, 0)..NUMBER(x, 15)*] [.NET: Double] = [Oracle: FLOAT] [.NET: Decimal] = [Oracle:NUMBER]