在我们的系统中有很多查询的计算结果可能会超过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。这基本上会导致比强制转换选项更多的工作。
我们能不能换个方式解决?
1条答案
按热度按时间ca1c2owp1#
您可以在阅读数据库中的查询结果之前,使用
TRUNC()
函数截断查询结果。TRUNC specs我从来没有使用过它,所以我不能对性能做任何陈述。