有效地将OracleDecimal转换为.NET十进制w /截断

时间:2011-09-26 18:19:20

标签: c# .net oracle type-conversion

尝试使用(decimal) OracleUdt.GetValue()

在C#中将以下oracle空间对象转换为坐标集(小数)时,我收到算术溢出异常
MDSYS.SDO_GEOMETRY(2001, 1041001, 
  MDSYS.SDO_POINT_TYPE(-2.89957214912471,1.56043985049899E-15,NULL),NULL,NULL)

根据Oracle documentation,这可能是因为其中一个十进制值超过了.NET的28位小数的精度范围。我们数据库中超出此精度限制的数据极为罕见,转换需要尽可能高效。

如果超过最大精度,优雅地截断结果,处理此异常的最佳选择是什么?

2 个答案:

答案 0 :(得分:1)

VB.NET代码,未经测试,但是我使用了类似于oracleDecimal的东西。 转换为C#应该很容易。

    OracleDecimal oraDec = MDSYS.SDO_GEOMETRY(2001, 1041001, 
            MDSYS.SDO_POINT_TYPE(-2.89957214912471,1.56043985049899E-15,NULL),NULL,NULL)
    oraDec = OracleDecimal.SetPrecision(oraDec, 28)    ' !!!
    Decimal netDec = oraDec.Value

答案 1 :(得分:1)

参考@ AndrewR的回答,考虑以下测试:

    [Test, Explicit]
    public void OracleDecimal_NarrowingConversion_ShouldSucceed()
    {
        string sigfigs = "-9236717.7113439267890123456789012345678";
        OracleDecimal od = new OracleDecimal(sigfigs);
        OracleDecimal narrowedOd = OracleDecimal.SetPrecision(od, 28); //fails
        //OracleDecimal narrowedOd = OracleDecimal.SetPrecision(od, 27); //succeeds
        object narrowedObjectValue = (object)narrowedOd.Value;
        Assert.IsInstanceOf<decimal>(narrowedObjectValue);
    }

12c Providers的Oracle文档声明精度应介于1到38之间。(http://docs.oracle.com/cd/E51173_01/win.122/e17732/OracleDecimalStructure.htm#i1003600)。 .Net'十进制'文档说精度为28 - 29 sig figs。我不知道为什么28在这种情况下不起作用。

修改:如果您删除了“ - ”符号,则上述内容的有效数字为28位。