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 significativosTipo: 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]