Quel type de données .NET est le meilleur pour mapper le type de données NUMBER Oracle dans NHibernate?

J’ai vu des exemples dans lesquels decimal est utilisé dans les projets NHibernate pour le mappage sur des colonnes de nombres entiers dans Oracle. En ce moment, j’utilise int et long dans mon programme.

Quels sont les avantages du decimal sur int / long ? Est-ce que ça fonctionne mieux?

J’ai vu décimal utilisé au lieu de int / long dans divers exemples. J’essaie juste de comprendre pourquoi

C’est probablement parce que .NET decimal et Oracle NUMBER un peu meilleurs que long et NUMBER et vous donnent plus de flexibilité. Si, par la suite, vous ajoutez une échelle dans la colonne Oracle, vous ne devrez pas modifier le type de données si vous avez déjà utilisé la decimal .

decimal est certainement plus lent int et long puisque les deux derniers sont pris en charge par le matériel. Cela dit, vous devez graver une quantité importante de données pour que cela fasse une différence. Je pense toujours que vous devriez utiliser long si c’est ce que vous avez à faire et que vous devriez également laisser les définitions de colonne de tableau représenter cela. NUMBER(18,0) pour long et ainsi de suite.

La raison pour laquelle la carte decimal un peu meilleure est que la long est de 64 bits et que la decimal est de 128 bits.

.NET

Type: décimal
Portée approximative: ± 1,0 × 10 ^ −28 à ± 7,9 × 10 ^ 28
Précision: 28-29 chiffres significatifs

Type: long
Gamme: –9.223.372.036.854.775.808 à 9.223.372.036.854.775.807
Précision: 18 (19 pour ulong) chiffres significatifs

Oracle

NUMBER défaut à 38 chiffres significatifs et à l’échelle 0 (entier).

Type: NUMBER
Gamme: + – 1 x 10 ^ -130 à 9,99 … 9 x 10 ^ 125
Précision: 38 chiffres significatifs

Microsoft est conscient du problème et note

Ce type de données est un alias pour le type de données NUMBER (38) et est conçu pour que OracleDataReader renvoie un System.Decimal ou OracleNumber au lieu d’une valeur entière. L’utilisation du type de données .NET Framework peut provoquer un débordement.

À bien y penser, vous avez besoin de BigInteger pour représenter le même nombre de chiffres significatifs que NUMBER défaut. Je n’ai jamais vu personne faire ça et je suppose que c’est un besoin très rare. De plus, BigInteger ne le ferait toujours pas puisque NUMBER peut être infini positif et négatif.

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