ODP.net填充数据集时,Oracle小数位数精度问题。例外:算术运算导致溢出

问题描述 投票:14回答:3

我正在c#.net 2(Visual Studio 2005 SP1)中工作,尝试使用Oracle10g数据库的表中的select *的结果填充数据集。 .net框架,IDE和数据库无法在此客户端站点上进行更改。

我正在使用ODP.net提供程序]连接,dll版本为2.102.2.20

运行填充命令时出现异常:

算术运算导致溢出

同样,如果我尝试在Visual Studio设计器中查看有问题的列(显示表数据),则表中该列的每一行都会得到

。如果我的查询选择其他带有整数的列(例如,省略该列),则该代码可完美运行。

当我从Toad在数据库中查看问题列时,它看起来很好,数据看起来像:

919.742866695572

我需要precision,因为蒙特卡洛模拟需要它。

如果不是使用数据适配器填充数据表,而是使用datareader并调用dataReader.getValue(columnIndex),则会收到相同的错误,但是如果我调用dataReader.GetOracleDecimal(columnIndex),则会得到所需的结果,没错。

我宁愿使用数据适配器并填充数据集(请注意,这些是未类型化的数据集,因为我无法从Oracle数据库获得自动生成的强类型化数据集来工作)。我不想使用datareader并浏览结果(挑选列值),因为我试图将此写为一种通用方法,以便在许多情况下都可以使用,而不管列数,十进制列的索引是否需要特定按数据类型接听电话。

有人可以帮忙吗?我可以使用ODP.net dll的新版本连接到较旧的Oracle10g

数据库吗?我想知道这是否有帮助。

谢谢

我正在c#.net 2(Visual Studio 2005 SP1)中工作,试图用来自Oracle10g数据库的select * from表的结果填充数据集。 .net框架,IDE和数据库不能是...

c# oracle datatable oracle10g odp.net
3个回答
1
投票

问题是结果值的精度太高而无法转换为System.Decimal,而不会丢失任何数据。我忘记了允许的确切数字位数,但是大约是18位左右。将结果值舍入为这么多位数是否可以接受?在您给出的示例中,round(MyColumn, 15)左右就足够了...


0
投票

You can try the latest version of ODP.Net (11g)。它是向后兼容的。我用它连接到10g数据库就好了。我认为它也应与VS 2005一起使用。对于clickonce部署,只需添加此问题引用的dll:What is the minimum client footprint required to connect C# to an Oracle database?重要说明是,如果您具有最新版本的odp.net,则所有dll都包含在安装目录中。您无需单独下载即时客户端。只需搜索它们。


0
投票

如果移至更高版本的ODP.NET(如12.x,则错误将从“算术溢出”变为“无效的强制转换异常”。您必须CAST数字值以减少疯狂的精度值(例如29或30个小数位),以使其更实用(例如2到4个小数位)。

© www.soinside.com 2019 - 2024. All rights reserved.