17

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

我正在SqlDataReader从 SQL Server 2008 数据库加载值,但在某些情况下,它无法将 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 框架中的真正错误。

4

1 回答 1

12

除了可能过于精确之外,这并不是您做错了什么。我也不认为它是一个新问题

你可以说它是一个错误,或者只是功能上的一个差距。.NetDecimal结构不能代表存储在 SQL Server 中的值,decimal因此OverflowException会抛出一个。

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

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

首先使用兼容的decimal定义可能更简单,除非您真的需要那种精度。如果你这样做,我很想知道为什么。

于 2012-07-04T10:39:51.663 回答