Какой тип данных .NET лучше всего подходит для сопоставления типа данных NUMBER Oracle в NHibernate?

Я видел несколько примеров, в которых decimal используется в проектах NHibernate для сопоставления столбцам целого числа в Oracle. Сейчас я использую int и long в своей программе.

В чем преимущества decimal над int/long? Он работает лучше?

Ответ 1

Я видел десятичное значение вместо int/long в разных примерах. Я просто пытаюсь понять, почему

Вероятно, потому, что .NET decimal и Oracle NUMBER отображаются немного лучше, чем long и NUMBER, а также дает вам большую гибкость. Если вы на более позднем этапе добавите шкалу в столбце Oracle, вам не придется менять тип данных, если вы уже использовали decimal.

decimal, конечно, медленнее, чем int и long, так как последние два поддерживаются в аппаратном обеспечении. Тем не менее, вам нужно собрать некоторые серьезные данные, чтобы они имели какое-то значение. Я все еще думаю, что вы должны использовать long, если это то, с чем вы имеете дело, а затем вы также должны позволить это определение столбца таблицы. NUMBER(18,0) для long и т.д.

Причина decimal немного лучше отображает, что long - 64 бита, а decimal - это 128 бит.

.NET

Тип: десятичный
  Приблизительный диапазон: ± 1,0 × 10 ^ -28 до ± 7,9 × 10 28 |   Точность: 28-29 значащих цифр

     

Тип: длинный
  Диапазон: -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807
  Точность: 18 (19 для улунга) значащие цифры

Oracle

NUMBER defaults до 38 значащих цифр и шкалы 0 (целое число).

Тип: НОМЕР
  Диапазон: + - 1 x 10 ^ -130 до 9.99... 9 x 10 ^ 125
  Точность: 38 значащих цифр

Microsoft знает о проблеме и примечания

Этот тип данных является псевдонимом для NUMBER (38) и сконструирован так что OracleDataReader возвращает System.Decimal или OracleNumber вместо этого целочисленного значения. Использование .NET. Тип данных Framework может вызвать Переполнение.

Подумайте, вам действительно нужно BigInteger, чтобы иметь возможность представлять одинаковое количество значащих цифр относительно того, что NUMBER по умолчанию. Я никогда не видел, чтобы кто-то это делал, и я предполагаю, что это очень редкая потребность. Кроме того, BigInteger все равно не сократил бы его, так как NUMBER может иметь положительную и отрицательную бесконечность.

Ответ 2

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

Ответ 3

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