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

C# 从SQL Server读取十进制值时出现溢出异常,c#,.net,sql-server,ado.net,decimal,C#,.net,Sql Server,Ado.net,Decimal,我想知道这是一个bug还是我出了什么问题 我使用SqlDataReader从SQLServer2008数据库加载值,但在某些情况下,它无法将SQL值转换为.net值。(.NET 4.0) 我将其追溯到一个测试用例,该测试用例演示了实际问题: 工作示例: "select convert(decimal(38, 19), 260000 ) as test" rs.GetValue(1); --> returns 260000 (decimal) 不工作exmaple: "select con

我想知道这是一个bug还是我出了什么问题

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

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

工作示例:

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

"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 framework中的一个真正的bug。

除了过于精确之外,这并不是你做错了什么。我认为这不是一个好主意

你可以说这是一个bug,或者只是功能上的缺陷。.Net
Decimal
结构无法表示存储在SQL Server
Decimal
中的值,因此会抛出一个
OverflowException

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

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


首先使用兼容的
decimal
定义可能更简单,除非您确实需要这种精度。如果您这样做,我很想知道原因。

十进制值的精度仅高达28。请浏览链接,但工作示例甚至使用了更高的精度。精度参数由SQL server本身选择。我最初是在服务器上进行(10,2)和(10,4)字段之间的一些基本计算。服务器选择(36,26)作为返回类型。我现在把所有的字段都改为(18,4),到目前为止它还在工作。