sql >> Base de Datos >  >> RDS >> Oracle

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

He visto usar decimales en lugar de int/long en varios ejemplos. Solo estoy tratando de entender por qué

Probablemente se deba a que .NET decimal y Oracle NUMBER mapas un poco mejores que long y NUMBER y también te da 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 usó decimal .

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

La razón decimal mapas un poco mejor es que long es de 64 bits y decimal es (más o menos) 128 bits.

.NET

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 para ulong) dígitos significativos

Oráculo

NUMBER el valor predeterminado es 38 dígitos significativos y escala 0 (entero).

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

Microsoft es consciente del problema y toma nota

Este tipo de datos es un alias para el tipo de datos NÚMERO(38) y está diseñado para que OracleDataReader devuelva un System.Decimal u OracleNumber en lugar de un valor entero. Usar el tipo de datos .NETFramework puede causar un desbordamiento.

Ahora que lo pienso, en realidad necesitas BigInteger para poder representar el mismo número de dígitos significativos que NUMBER por defecto a. Nunca he visto a nadie hacer eso y supongo que es una necesidad muy rara. También BigInteger todavía no lo cortaría desde NUMBER puede ser de infinito positivo y negativo.