wake-up-neo.com

Welcher .NET-Datentyp eignet sich am besten für die Zuordnung des NUMBER Oracle-Datentyps in NHibernate?

Ich habe einige Beispiele gesehen, in denen decimal in NHibernate-Projekten für die Zuordnung zu ganzzahligen Spalten in Oracle verwendet wird. Im Moment verwende ich int und long in meinem Programm.

Was sind die Vorteile von decimal gegenüber int/long? Funktioniert es besser?

45
Ilya Kogan

Ich habe in verschiedenen Beispielen Dezimalstellen anstelle von int/long gesehen. Ich versuche nur zu verstehen, warum

Das liegt wahrscheinlich daran, dass .NET decimal und Oracle NUMBERordnet etwas besser z als long und NUMBER und es bietet Ihnen auch mehr Flexibilität. Wenn Sie zu einem späteren Zeitpunkt ein scale in die Oracle-Spalte einfügen, müssen Sie den Datentyp nicht ändern, wenn Sie bereits decimal verwendet haben.

decimal ist sicherlich langsamer als int und long, da die beiden letzteren in der Hardware unterstützt werden. Das heißt, Sie müssen einige ernsthafte Datenmengen brechen, um einen Unterschied zu machen. Ich denke immer noch, dass Sie long verwenden sollten, wenn Sie es damit zu tun haben, und dann sollten Sie auch zulassen, dass die Tabellenspaltendefinitionen dies darstellen. NUMBER(18,0) für long und so weiter.

Der Grund, warum decimal etwas besser abgebildet wird, ist, dass long 64 Bit und decimal (eine Art) 128 Bit beträgt.

. NET

Typ: dezimal
Ungefährer Bereich: ± 1,0 × 10 ^ −28 bis ± 7,9 × 10 ^ 28
Präzision: 28-29 signifikante Stellen

Typ: lang
Bereich: –9.223.372.036.854.775.808 bis 9.223.372.036.854.775.807
Genauigkeit: 18 (19 für lange) signifikante Ziffern

Oracle

NUMBERStandard bis 38 signifikante Stellen und Skala 0 (Ganzzahl).

Typ: [~ # ~] Nummer [~ # ~]
Bereich: + - 1 x 10 ^ -130 bis 9,99 ... 9 x 10 ^ 125
Präzision: 38 signifikante Stellen

Microsoft ist sich des Problems bewusst und Notizen

Dieser Datentyp ist ein Alias ​​für den Datentyp NUMBER (38) und ist so konzipiert, dass OracleDataReader anstelle eines Ganzzahlwerts eine System.Decimal oder OracleNumber zurückgibt. Die Verwendung des .NET Framework-Datentyps kann einen Überlauf verursachen.

Wenn Sie sich das überlegen, brauchen Sie tatsächlich BigInteger , um die gleiche Anzahl von signifikanten Ziffern darstellen zu können, wie für NUMBER die Standardeinstellung ist. Ich habe noch nie jemanden gesehen, der das getan hat, und ich nehme an, es ist eine sehr seltene Notwendigkeit. Auch BigInteger würde es immer noch nicht schneiden, da NUMBER von positiver und negativer Unendlichkeit sein kann.

57
Jonas Elfström
[.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]  
39
Homam
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    
12
Carl Prothman