从SQL Server读取十进制值时出现溢出exception
我想知道这是一个错误还是我出错了。
我正在使用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个值时抛出exception,但我不理解它们背后的机制。
所以,我想知道这是否是.net框架中的真正错误。
除了过于精确之外,这不是你做错的事。 我也不认为这是一个新问题 。
你可能会认为它是一个错误,或只是function上的差距。 .Net Decimal
结构不能表示存储在SQL Server decimal
的值,因此抛出了OverflowException
。
您需要在检索之前将值操作到数据库中的兼容内容,或者以原始二进制或字符串格式读取数据并在.Net端进行操作。
或者,您可以编写一个处理它的新类型。
除非你真的需要那种精度,否则首先使用兼容的decimal
定义可能更简单。 如果你这样做,我有兴趣知道为什么。
- 即使安装和使用了System.IdentityModel.Tokens,也找不到JWTSecurityTokenHandler和SecurityTokenDescriptor
- TFS 2013 API – 检索为WI所做的所有更改
- Windows服务等待处理停止请求的最长时间是多少以及如何请求额外的时间
- 为什么BackgroundWorker不需要在ProgressChanged事件处理程序中调用?
- 你调用的对象是空的
- 在跨平台(Xamarin)应用程序中使用哪种IoC continer?
- 为什么WPF中的依赖项属性必须是静态的
- Nugets安装在visual studio 2015中
- 无法更新数据库“* .mdf”,因为只读EntityFramework