Ho visto decimale usato invece di int/long in vari esempi. Sto solo cercando di capire perché
Probabilmente è perché .NET decimal
e Oracle NUMBER
mappe un po' meglio di long
e NUMBER
e ti dà anche più flessibilità. Se in una fase successiva aggiungi una scala nella colonna Oracle non dovresti cambiare il tipo di dati se hai già utilizzato decimal
.
decimal
è sicuramente più lento di int
e long
poiché gli ultimi due sono supportati nell'hardware. Detto questo, devi sgranocchiare una seria quantità di dati affinché faccia la differenza. Continuo a pensare che dovresti usare long
se questo è ciò con cui hai a che fare e quindi dovresti anche lasciare che le definizioni delle colonne della tabella lo rappresentino. NUMBER(18,0)
per long
e così via.
Il motivo decimal
mappe un po' meglio è che long
è 64 bit e decimal
è (più o meno) 128 bit.
.NET
Digita:decimale
Intervallo approssimativo:da ±1,0 × 10^−28 a ±7,9 × 10^28
Precisione:28-29 cifre significativeDigita:lungo
Intervallo:da –9.223.372.036.854.775.808 a 9.223.372.036.854.775.807
Precisione:18 (19 per ulong) cifre significative
Oracolo
NUMBER
il valore predefinito è 38 cifre significative e scala 0 (intero).
Digita:NUMERO
Intervallo:+- 1 x 10^-130 a 9,99...9 x 10^125
Precisione:38 cifre significative
Microsoft è a conoscenza del problema e delle note
Questo tipo di dati è un alias per il tipo di dati NUMBER(38) ed è progettato in modo che OracleDataReader restituisca un System.Decimal o OracleNumber invece di un valore intero. L'utilizzo del tipo di dati .NETFramework può causare un overflow.
A pensarci bene, in realtà hai bisogno di BigInteger
per poter rappresentare lo stesso numero di cifre significative di quale NUMBER
predefinito a. Non ho mai visto nessuno farlo e suppongo che sia un'esigenza molto rara. Anche BigInteger
ancora non lo taglierei da NUMBER
può essere di infinito positivo e negativo.