C# ODP.net在填充数据集时出现Oracle十进制数字精度问题。异常:算术运算导致溢出
我在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数据库吗?我想知道这是否有帮助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中查看有问题的列,请显示表中该列的每一行的数据。如果我的查询选择了其他包含整数的列(例如省略此列)
谢谢。它是向后兼容的。我用它连接到一个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,因此我不确定这是否也会影响单元格格式。这也意味着我需要了解表中的每一列,我不能只从表中选择*