使用dotConnection PostgreSQL的OverflowException

时间:2014-08-06 12:05:58

标签: c# postgresql dotconnect

我使用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,但首先我需要找到有问题的行。

1 个答案:

答案 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类型。