postgresql System. DeclarationOverflowException-处理大数值数据表

oknrviil  于 5个月前  发布在  PostgreSQL
关注(0)|答案(1)|浏览(84)

在我们的系统中有很多查询的计算结果可能会超过System. Decimal的限制。这会从NPGSQL .NET驱动程序返回一个错误。
考虑这个小例子:

-- Column : Price numeric(19,5)
-- Column : Discount numeric(29,15)
-- Column : ExchangeRate numeric(29,20)

-- Price = 119.91237
-- Discount = 10%
-- ExhangeRate = 2.581236

-- So Total = Price * Discount * ExchangeRate
SELECT 
    119.91237::numeric(19,5) * 
    0.10::numeric(29,15) * 
    2.581236::numeric(29,20)

字符串
如果我们尝试在应用程序中使用读取器读取此值:

var value = reader.GetValue(0);


返回此错误:

System.OverflowException: Numeric value does not fit in a System.Decimal
NumericHandler.Read(NpgsqlReadBuffer buf, Int32 len, Boolean async, FieldDescription fieldDescription)
NpgsqlTypeHandler.Read[TAny](NpgsqlReadBuffer buf, Int32 len, Boolean async, FieldDescription fieldDescription)
NpgsqlTypeHandler`1.ReadAsObject(NpgsqlReadBuffer buf, Int32 len, Boolean async, FieldDescription fieldDescription)
NpgsqlTypeHandler.ReadAsObject(NpgsqlReadBuffer buf, Int32 len, FieldDescription fieldDescription)
NpgsqlDataReader.GetValue(Int32 ordinal)


强制转换选项-一个选项是将此查询的结果强制转换为适合System. Decimal的较小数值。但是考虑到我们所有的查询,这将是大量的工作,并且很难在我们当前的代码库中找到所有这些地方。
字符串选项-另一个选项是将所有numeric类型的结果威胁为字符串,然后截断字符串,以便稍后将其表示为System. Decimal。这基本上会导致比强制转换选项更多的工作。
我们能不能换个方式解决?

ca1c2owp

ca1c2owp1#

您可以在阅读数据库中的查询结果之前,使用TRUNC()函数截断查询结果。TRUNC specs
我从来没有使用过它,所以我不能对性能做任何陈述。

相关问题