从SQL Server读取十进制值时出现溢出异常

时间:2012-07-04 09:30:17

标签: c# .net sql-server ado.net decimal

我想知道这是一个错误还是我错了。

我从SQL Server 2008数据库加载SqlDataReader的值,但在某些情况下,它无法将SQL值转换为.net值。 (.NET 4.0)

我已将其追溯到一个测试案例,该案例演示了实际问题:

工作示例:

"select convert(decimal(38, 19), 260000 ) as test"
rs.GetValue(1);
--> returns 260000 (decimal)

不工作:

"select convert(decimal(36, 26), 260000 ) as test"

rs.GetValue(1);
--> throws
   System.OverflowException: Conversion overflows.
   at System.Data.SqlClient.SqlBuffer.get_Decimal()
   at System.Data.SqlClient.SqlBuffer.get_Value()
   at System.Data.SqlClient.SqlDataReader.GetValueInternal(Int32 i)
   at System.Data.SqlClient.SqlDataReader.GetValues(Object[] values)

我已经检查了SQL Server恢复的实际值。他们的不同之处在于,非工作者使用4个整数表示值,而工作者只使用3个。

我还检查了.net Reflector的源代码,它揭示了如果值存在超过3个值时抛出异常,但我不理解它们背后的机制。

所以,我想知道这是否是.net框架中的真正错误。

1 个答案:

答案 0 :(得分:7)

除了过于精确之外,它不是你做错了。我认为它不是new problem either

你可以认为它是一个错误,或只是功能上的差距。 .Net Decimal结构无法表示存储在SQL Server decimal中的值,因此会引发OverflowException

要么在检索之前将值操作到数据库中兼容的东西,要么以原始二进制或字符串格式读取数据并在.Net端进行操作。

或者,您可以编写一个处理它的新类型。

首先使用兼容的decimal定义可能更简单,除非你真的需要那种精度。如果你这样做,我有兴趣知道原因。