2014-08-06 3 views
0

Я создал модель из базы данных, используя dotConnect для PostgreSQL, профессиональное издание. Все работает отлично, исключая одно из объектов. Некоторые свойства были сгенерированы как десятичные. Образец недвижимости в моей Entity:OverflowException with dotConnection PostgreSQL

public global::System.Nullable<decimal> CollectionToPay 
{ 
    get 
    { 
     global::System.Nullable<decimal> value = _CollectionToPay; 
     OnGetCollectionToPay(ref value); 
     return value; 
    } 
    set 
    { 
     if (_CollectionToPay != value) 
     { 
      OnCollectionToPayChanging(ref value); 
      ReportPropertyChanging("CollectionToPay"); 
      _CollectionToPay = StructuralObject.SetValidValue(value); 
      ReportPropertyChanged("CollectionToPay"); 
      OnCollectionToPayChanged(); 
     } 
    } 
} 

private global::System.Nullable<decimal> _CollectionToPay; 

Когда я пытаюсь получить коллекцию сущностей я получаю сообщение об ошибке:

A first chance exception of type 'System.OverflowException' occurred in Devart.Data.PostgreSql.dll

Additional information: Value was either too large or too small for a Decimal.

Я даже не знаю, какой ряд casues проблемы. Я собираю около 400 строк. Есть ли быстрый способ определить проблемную строку? Таблица имеет около 170 столбцов, около 20 имеют десятичный тип. Я набирал строки в pgAdmin, но не значения выглядят слишком большими/маленькими. Что я могу сделать? Я предлагаю изменить decimal на double, но сначала мне нужно найти проблемные строки.

ответ

1

C#'s Decimal is a bounded type: это 128-битное фиксированное значение. Предположительно это IEEE 574:2008 decimal128 или эквивалент.

Это не эквивалент PostgreSQL's numeric type, что я и предполагаю, что вы его сопоставляете. (Было бы неплохо, если бы вы показали это). numeric - Произвольная точность и масштабирование двоично-кодированных десятичных. Его практический предел составляет около 1 ГБ, но он настолько огромен, что это невообразимое число.

Вы не можете найти возможно numeric в C# Decimal. Предположительно, ваше приложение содержит значения, которые не могут быть сохранены в Decimal.

Возможно, вам понадобится реализовать двоично-кодированный десятичный тип данных на C# или настроить данные, чтобы исключить значения вне диапазона.

Это нормально карта numeric к Decimal если добавить CHECK ограничения на numeric столбцов, чтобы ограничить их диапазон значений. Лично я рекомендую сделать это, используя тип DOMAIN.

+0

К сожалению, я не могу изменить схему или даже манипулировать данными. Это внешняя система, и мне предоставляется только выполнение выборок. Более того, максимальное значение, хранящееся, представляет собой проблемный столбец: «88919.999999883' и min' 0' .. Поэтому проблема должна быть с точностью. Число с наибольшей точностью - '6479.696856287425149700598802645'. Присвоение непосредственно десятичному значению не вызывает ошибок: 'decimal a = 6479.696856287425149700598802645m'. Возможно, pgAdmin усекает отображаемое значение. –

+0

Ну, в этом случае вам нужно будет определить, какое значение вызывает исключение в вашем коде. Отладчик может быть полезен для этого. Или может быть больше деталей в цепочке причин исключений (если C# делает то же, что и Java, я не очень много C#). –

+0

Проблемное значение ... '5670.074606244819010776457585128'. К сожалению, 'decimal a = 5670.074606244819010776457585128m' также работает. Хорошо, я вижу. Значение округляется до '5670.0746062448190107764575851'. –