Вопрос

Я знаю, что в Интернете есть несколько тем и сообщений по этому вопросу, и я читал их (не каждую статью, должен признаться), но ни одна из них меня не удовлетворила полностью.

Моя ситуация:
Я использую ODP.net (dll версии 2.111.6.0) для доступа к базе данных Oracle (версия 10 + 11) и DataReader для получения данных (.NET 3.5, C#).

Использование этого кода приводит к 'System.OverflowException (арифметическая операция привела к переполнению.)'


decimal.TryParse(oraReader.GetOracleDecimal(0).Value.ToString(), 
  NumberStyles.Any, null, out parsedOraDecimal)

и это приводит к значению '3,0000000000000000000000000000000000000000000000000000000000E-126'


decimal.TryParse(oraReader.GetOracleValue(0).ToString(), 
  NumberStyles.Any, null, out parsedOraDecimal)

Теперь мне нужно найти способ правильно получить и оценить это значение — БД также используется из других приложений, которые находятся вне моего контроля, поэтому изменения в них невозможны.

Преобразование типов в моем коде C# из «десятичного» в «двойной» также не является вариантом.

Есть идеи?

Это было полезно?

Решение

У меня только что возникла аналогичная проблема, и я попробовал изменить OracleDataAdapter для возврата конкретных типов Oracle ( data_adapter.ReturnProviderSpecificTypes = true;), но это всего лишь PITA, в конечном итоге вы приводите OracleStrings обратно к строкам и т. д.

В конце концов я решил эту проблему, выполнив точное округление в операторе SQL с помощью функции округления Oracle:

SELECT round( myfield, 18 ) FROM mytable

Затем Dotnet с радостью преобразует это число в десятичное число.

Другие советы

OracleDecimal имеет большую точность, чем десятичная.По этой причине вам необходимо сначала уменьшить точность.Забудьте обо всем синтаксическом анализе, используйте неявное преобразование.Попробуйте что-нибудь вроде (непроверено):

decimal d = (decimal)(OracleDecimal.SetPrecision(oraReader.GetOracleDecimal(0), 28));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top