Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ODP.net在填充数据集时出现Oracle十进制数字精度问题。异常:算术运算导致溢出_C#_Oracle_Datatable_Oracle10g_Odp.net - Fatal编程技术网

C# ODP.net在填充数据集时出现Oracle十进制数字精度问题。异常:算术运算导致溢出

C# ODP.net在填充数据集时出现Oracle十进制数字精度问题。异常:算术运算导致溢出,c#,oracle,datatable,oracle10g,odp.net,C#,Oracle,Datatable,Oracle10g,Odp.net,我在c.NET2VisualStudio2005SP1中工作,试图用Oracle10g数据库的select*from表中的结果填充数据集。无法在此客户端站点更改.net framework、IDE和数据库 我正在使用ODP.net提供程序进行连接。dll版本为2.102.2.20 当我运行fill命令时,我得到一个异常: 算术运算导致溢出 此外,如果我试图在VisualStudio designer中查看有问题的列,请显示表中该列的每一行的数据。如果我的查询选择了其他包含整数的列(例如省略此列)

我在c.NET2VisualStudio2005SP1中工作,试图用Oracle10g数据库的select*from表中的结果填充数据集。无法在此客户端站点更改.net framework、IDE和数据库

我正在使用ODP.net提供程序进行连接。dll版本为2.102.2.20

当我运行fill命令时,我得到一个异常:

算术运算导致溢出

此外,如果我试图在VisualStudio designer中查看有问题的列,请显示表中该列的每一行的数据。如果我的查询选择了其他包含整数的列(例如省略此列),那么代码将非常有效

当我从Toad在数据库中查看该列时,该列看起来很好,数据如下所示:

919.742866695572

我需要精度,因为这是蒙特卡罗模拟所需要的

如果不使用数据适配器填充数据表,而是使用datareader并调用datareader.getValuecolumnIndex,则会出现相同的错误,但如果调用datareader.GetOracleDecimalcolumnIndex,则会得到我要查找的结果,没有错误

我宁愿使用数据适配器并填充数据集注意这些是非类型化的数据集,因为我无法从oracle数据库获得自动生成的强类型数据集。我不想使用datareader并遍历结果,因为我试图将其作为一种通用方法编写,以适用于许多场景,而不考虑列数、十进制列的索引,这些都需要按数据类型进行特定的get调用

有人能帮忙吗? 我可以使用新版本的ODP.net DLL连接到旧的Oracle10g数据库吗?我想知道这是否有帮助


谢谢。它是向后兼容的。我用它连接到一个10g数据库就可以了。我认为它也应该适用于VS2005。对于clickonce部署,只需添加此问题引用的DLL:一个重要的注意事项是,如果您拥有最新版本的odp.net,则所有DLL都包含在安装目录中。您不需要单独下载即时客户端。只需搜索它们。

问题是结果值的精度太高,无法在不丢失一些数据的情况下转换为System.Decimal。我忘了允许的确切数字,但大约是18位左右。将结果值四舍五入到这么多位数可以接受吗?在您给出的示例中,一个roundMyColumn,15左右就足够了…

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

要识别十进制值过大的列和行,可以在将MY_模式、MY_表和数字10替换为say 25后运行下面的SQL,以识别值超过25位的列。此SQL将生成一个SQL,应该运行该SQL来识别问题列

SELECT 'SELECT ' || LISTAGG('MAX(LENGTH(TO_CHAR(ABS(' || column_name || ') - FLOOR(ABS(' || column_name || '))))) - 1  AS decimals_' || column_name || CHR(13)
                    , CHR(9)|| ', ') WITHIN GROUP (ORDER BY rn)  ||
                    ' FROM ' || owner || '.' || table_name  || CHR(13) ||
                    ' WHERE '  || CHR(13) ||
                      LISTAGG('(LENGTH(TO_CHAR(ABS(' || column_name || ') - FLOOR(ABS(' || column_name || ')))) - 1) > 10 ' || CHR(13)
                                , CHR(9)|| '  OR  ')
WITHIN GROUP (ORDER BY rn) AS Nasty_Numbers_Finder_Query
FROM
(
    SELECT  owner, table_name, column_name,
        row_number() OVER ( PARTITION BY table_name  ORDER BY rownum) rn
    FROM  dba_tab_columns
    WHERE
        OWNER = 'MY_SCHEMA'
        AND table_name = 'MY_TABLE'
        AND (data_type LIKE '%FLOAT%'
            OR data_type LIKE '%NUMERIC%')
) a
GROUP BY owner, table_name

有关更多信息,我已在博客上发布。

太好了,我在我的电脑上尝试一下,会让你知道我的进展如何。在已部署的计算机上,我是否也需要安装此软件?或者我可以只使用较新版本的Oracle.DataAccess.Dll部署我的控制台应用程序?它不是我更喜欢只在我的应用程序bin文件夹中部署此应用程序,其中包含oracle的所有必需DLL,而不是安装在目标部署的计算机a服务器上,这涉及到什么以及需要哪些文件?感谢您希望Oracle Developer Tools for Visual Studio包含您需要的所有DLL。在客户端机器上安装它的唯一方法是安装完整的Oracle客户端或使用我推荐的即时客户端。对于instant client,您只需查找.dll,请参阅以获取更多信息,并将其添加到“复制为内容”。这将确保它们正确部署。将ODP.net版本更改为11g Oracle.DataAccess.dll 2.111.6.20无助于我仍然获得算术运算,导致溢出异常。有一种解决方案虽然不理想,但可以这样做:从表中选择列,但现在我的dataColumn类型不同,我将这些数据写入Excel,因此我不确定这是否也会影响单元格格式。这也意味着我需要了解表中的每一列,我不能只从表中选择*