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

Chu*_*uck 11 .net c# sql-server ado.net decimal

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

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

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

工作范例:

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

不工作:

"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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jod*_*ell 9

除了过于精确之外,这不是你做错的事.我也不认为这是一个新问题.

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

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

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

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

  • 精度参数由 SQL 服务器本身选择。我最初是在服务器上在 (10,2) 和 (10,4) 字段之间进行一些基本计算。服务器选择 (36,26) 作为返回类型。我现在将所有字段更改为 (18,4),并且到目前为止一直有效。 (3认同)