我使用dotConnect为PostgreSQL创建了数据库模型,专业版。一切都很好,例外的一个实体。一些属性生成为十进制。我的Entity
中的示例属性:
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;
当我尝试获取实体集合时,我收到错误:
类型&#39; System.OverflowException&#39;的第一次机会异常。发生了 在Devart.Data.PostgreSql.dll
中其他信息:价值太大或太小了 小数。
我甚至都不知道哪一行有问题。我拿了大约400行。有没有快速的方法来确定有问题的行?表有大约170列,大约20列是十进制类型。我已经在pgAdmin中获取了行,但是没有值看起来太大/太小了。我能做什么?我认为我将decimal
更改为double
,但首先我需要找到有问题的行。
答案 0 :(得分:1)
C#'s Decimal
is a bounded type:它是128位固定大小的值。大概它是IEEE 574:2008 decimal128
或同等的。
等同于PostgreSQL's numeric
type,这是我认为你将其映射到的地方。 (如果你展示了它,那就太好了)。 numeric
是任意精度和比例二进制编码的十进制。它的实际限制大约是1GB,但是它太大了以至于它是一个难以想象的数字。
您无法在C#numeric
中存储任何可能的Decimal
。据推测,您的应用程序包含无法存储在Decimal
中的值。
您可能需要在C#中找到二进制编码的十进制数据类型实现,或者调整数据以消除超出范围的值。
如果您向numeric
列添加Decimal
约束以限制其值范围,则可以将CHECK
映射到numeric
。我个人建议使用DOMAIN
类型。