Эффективное преобразование OracleDecimal в .NET десятичное с усечением - PullRequest
3 голосов
/ 26 сентября 2011

Я получаю исключение арифметического переполнения при попытке преобразовать следующий пространственный объект оракула в набор координат (десятичных дробей) в C #, используя (decimal) OracleUdt.GetValue()

MDSYS.SDO_GEOMETRY(2001, 1041001, 
  MDSYS.SDO_POINT_TYPE(-2.89957214912471,1.56043985049899E-15,NULL),NULL,NULL)

Согласно Документация Oracle Вероятно, это связано с тем, что одно из десятичных значений превышает диапазон точности .NET, равный 28 десятичным.Данные, которые превышают этот предел точности в нашей базе данных, крайне редко , и преобразование должно быть максимально эффективным.

Каков наилучший вариант для обработки этого исключения путем изящного усечения результата, еслиэто превышает максимальную точность?

Ответы [ 2 ]

1 голос
/ 25 января 2016

Применительно к ответу @ 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);
    }

Документация Oracle для провайдеров 12c гласит, что точность должна быть от 1 до 38. (http://docs.oracle.com/cd/E51173_01/win.122/e17732/OracleDecimalStructure.htm#i1003600). В десятичных документах .Net говорится, что точность составляет 28-29 сигн. не знаю, почему 28 не работает в этом случае.

Редактировать : Если вы уберете знак «-», вышеприведенный код будет работать с 28 значащими цифрами.

1 голос
/ 12 апреля 2013

код 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...