Преобразование числа Oracle в десятичное число C#
-
19-09-2019 - |
Вопрос
Я знаю, что в Интернете есть несколько тем и сообщений по этому вопросу, и я читал их (не каждую статью, должен признаться), но ни одна из них меня не удовлетворила полностью.
Моя ситуация:
Я использую 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));