46 votes

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

J'ai vu des exemples dans lesquels decimal est utilisé dans des projets NHibernate pour le mappage sur des colonnes de nombres entiers dans Oracle. À l'heure actuelle, j'utilise int et long dans mon programme.

Quels sont les avantages de decimal sur int / long ? Est-ce que cela fonctionne mieux?

58voto

Jonas Elfström Points 16453

J'ai vu décimal utilisé à la place de int/long dans divers exemples. J'essaie juste de comprendre pourquoi

C'est probablement parce que .NET decimal et Oracle NUMBER cartes un peu mieux que d' long et NUMBER et il vous donne également plus de flexibilité. Si, à un stade ultérieur ajoute une certaine échelle dans l'Oracle de la colonne, alors vous n'avez pas à changer de type de données si vous avez déjà utilisé decimal.
decimal est certainement plus lent que l' int et long depuis le plus tard est pris en charge par le matériel. Cela dit, vous devez rassembler montant considérable de données pour faire une différence. Je pense toujours que vous devez utiliser long si ce que vous avez à traiter avec, puis vous devriez également le tableau des définitions de colonne représentent qu'. NUMBER(18,0) pour long et ainsi de suite.

La raison en decimal cartes un peu mieux, c'est qu' long 64 bits et decimal est (un peu) de 128 bits.

.NET

Type: décimal
La Gamme 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 valeurs par défaut à 38 chiffres significatifs et une échelle de 0 (entier).

Type: NUMÉRO de
Plage: +- 1 x 10^-130 à 9.99...9 x 10^125
Précision: 38 chiffres significatifs

Microsoft est conscient du problème et des notes

Ce type de données est un alias de la NOMBRE(38) type de données, et est conçu de sorte que le OracleDataReader renvoie une Système.Décimal ou OracleNumber au lieu d'une valeur entière. À l'aide de l' .NET Cadre type de données, il peut provoquer une dépassement de capacité.

Venez pour penser à elle vous avez réellement besoin d' BigInteger à être en mesure de représenter le même nombre de chiffres significatifs à ce qu' NUMBER par défaut. Je n'ai jamais vu personne le faire et je suppose que c'est un très rare de besoin. Aussi BigInteger n'est pas coupé depuis NUMBER peuvent être positifs et négatifs de l'infini.

40voto

Homam Points 8664
[.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]  

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X