Я знаю, что существует несколько потоков и сообщений относительно этой проблемы в Интернете, и я считал их (не каждая статья, я должен признать), но ни один из них действительно полностью не удовлетворял меня.
Моя ситуация:
Я использую ODP.net (dll версия 2.111.6.0) для доступа к DB Oracle (версия 10 + 11) и DataReader для получения данных (.NET 3.5, C#).
Используя этот код приводит к 'Системе. OverflowException (Арифметическая операция привела к переполнению.)'
decimal.TryParse(oraReader.GetOracleDecimal(0).Value.ToString(),
NumberStyles.Any, null, out parsedOraDecimal)
и эти результаты в значении '3,000000000000000000000000000000000000000000000000000000000E-126'
decimal.TryParse(oraReader.GetOracleValue(0).ToString(),
NumberStyles.Any, null, out parsedOraDecimal)
Теперь я должен найти некоторый способ получить и оценить это значение правильно - DB также используется из других приложений, которые находятся вне моего контроля так изменения, там не возможны.
Преобразование типов в моем коде C# от 'десятичного числа' для 'удваиваний' является также не действительно опцией.
Какие-либо идеи?
У меня была аналогичная проблема, и я попробовал изменить OracleDataAdapter, чтобы он возвращал определенные типы Oracle (data_adapter.ReturnProviderSpecificTypes = true;), но это просто PITA, вы в конечном итоге преобразуете OracleStrings обратно в строки и т. Д.
В конце концов я решил эту проблему, выполнив округление точности в операторе SQL с помощью функции Oracle round:
SELECT round( myfield, 18 ) FROM mytable
Dotnet затем с радостью преобразует число в десятичное.
OracleDecimal имеет большую точность, чем десятичная. По этой причине вам сначала нужно снизить точность. Забудьте о синтаксическом анализе, используйте неявное преобразование. Попробуйте что-нибудь вроде (непроверено):
decimal d = (decimal)(OracleDecimal.SetPrecision(oraReader.GetOracleDecimal(0), 28));