C# 通过OleDB/Oracle提供程序从Oracle到SQL Server的十进制转换问题

C# 通过OleDB/Oracle提供程序从Oracle到SQL Server的十进制转换问题,c#,sql,oracle,oracle11g,oledb,C#,Sql,Oracle,Oracle11g,Oledb,编辑:我现在强烈怀疑这种行为是由于OleDB.Oracle提供程序中的错误造成的。在其他测试中,我能够对其他具有负刻度的强制转换列值执行Select语句,这不会导致“十进制字节构造函数…”异常。我还注意到,在查看模式时,提供程序返回的是scale的绝对值,例如scale-2返回为2。此外,当通过ODP.NET驱动程序而不是Oracle OLEDB提供程序运行时,此相同的测试查询不会导致异常。按照Lalit在评论中的建议更改数字分隔符并没有影响结果,但我还是感谢他的时间。我将继续研究这个问题,并将

编辑:我现在强烈怀疑这种行为是由于OleDB.Oracle提供程序中的错误造成的。在其他测试中,我能够对其他具有负刻度的强制转换列值执行Select语句,这不会导致“十进制字节构造函数…”异常。我还注意到,在查看模式时,提供程序返回的是scale的绝对值,例如scale-2返回为2。此外,当通过ODP.NET驱动程序而不是Oracle OLEDB提供程序运行时,此相同的测试查询不会导致异常。按照Lalit在评论中的建议更改数字分隔符并没有影响结果,但我还是感谢他的时间。我将继续研究这个问题,并将建议是否了解更多信息

我有一个64位C应用程序,它通过Oracle 11g OLEDB提供程序从Oracle数据库获取数据。当Oracle返回定义或强制转换为负刻度的数值类型时,例如“选择Cast123.1作为Number3,-1”,则GetSchemaTable中映射的OleDB架构将该列报告为小数点,刻度为255。文档表明255表示不适用或不相关的值

稍后在包含此类列的行上调用OleDBDataReader.GetValues时,会引发ArgumentException,建议“十进制字节数组构造函数…需要四个有效的十进制字节,告诉我即使OleDB提供程序认为其十进制数据,也没有有效的十进制数据可读取。我假设数据是存在的,但不确定具体是什么

我试过:

通过调用OleDbDataReader.GetBytes显式从列中获取字节即使是调用大小缓冲区excepts,但这样做会引发指定的强制转换无效。 编写一段测试代码,以获取每个可能支持的返回数据类型,例如GetInt16、GetInt32等,并且每个类型都抛出相同的异常无效转换。
在获取使用负刻度定义的列时,Oracle OleDB提供程序是否甚至不向调用方返回数据?是否有其他机制至少可以将字节从池中取出并在接收端进行操作?

我无法给出任何答案,但作为临时解决办法,也许您可以强制转换。。。。作为数字…,在你的SELECT语句中是0?不幸的是,@SylvainLeroux,我不能;我无法控制此代码执行的查询。感谢您花时间回答-当然感谢您的努力。您能告诉我们您在Oracle方面有哪些特权吗?因此,我们谁可以在Oracle上提供帮助/帮助,谁就可以特别推荐您。@LalitKumarB谢谢,Lalit…基本上,我使用的帐户非常有限-执行此场景中Oracle端涉及的查询,仅此而已。如果您要查找任何特定的内容,我会假定特权不可用。@Lalit出于好奇,如果David有足够的特权,您会采取什么策略来解决该问题?也许我没有完全理解这个问题,但我认为这与OLEDB提供商没有正确处理负刻度有关。这可以在不修改模式的情况下解决吗?