c# - c#中sql查询列中的无限小数值

标签 c# sql oracle decimal type-conversion

我遇到了在 NET (c#) 中尝试获取此简单 sql 查询的结果时出现的问题:

select 1/3 as col from dual

OracleDataReader.GetValue(i) 抛出异常:

Arithmetic operation resulted in an overflow.
at Oracle.DataAccess.Types.DecimalConv.GetDecimal(IntPtr numCtx)
at Oracle.DataAccess.Client.OracleDataReader.GetDecimal(Int32 i)
at Oracle.DataAccess.Client.OracleDataReader.GetValue(Int32 i)

我发现当数字精度超过 28 位时会发生此错误,因此会导致错误:

select round(1/3,29) as col from dual

但这不会

select round(1/3,28) as col from dual

尝试将 C# 中的列值视为 Double 时出现错误“无效转换”

除了无处不在的数字列四舍五入之外,有谁知道避免这种情况的任何方法吗?

最佳答案

由于数据类型是十进制,所以它必须是精确的。不可能以十进制类型存储 1/3 的无穷小数。一般Conversions from Single or Double to Decimal throw an OverflowException if the result of the conversion is not representable as a Decimal .因此,我需要将该值读取为 double 值,或者确保它是正确的小数。

关于c# - c#中sql查询列中的无限小数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10101797/

相关文章:

SQL 错误 : ORA-00984: column not allowed here

c#获取接口(interface)方法注释

c# - c# 应用程序会在 linux 操作系统上运行吗

sql - 计算过期的凭证,给定一个固定的窗口

c# - 如何从 SQL Server 数据库中获取以给定字符串开头的条目?

SQL。调用 PERCENTILE_CONT 函数的意外结果

c# - 具有 MaxDegreeOfParallelism 和实际线程数的 ParallelOptions

c# - 在 Sitecore 6.5 中按 ID 获取项目

sql - 在 SQL 列中设置默认 TIMESTAMP

mysql - 处理 SQL 保留表名和列名