Oracle номер в C # десятичный - PullRequest
9 голосов
/ 15 декабря 2009

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

Моя ситуация:
Я использую 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,00000000000000000000000000000000000000000000000000000000000000000000000E-126 '


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

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

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

Есть идеи?

Ответы [ 2 ]

15 голосов
/ 15 декабря 2009

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

decimal d = (decimal)(OracleDecimal.SetPrecision(oraReader.GetOracleDecimal(0), 28));
9 голосов
/ 10 марта 2010

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

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

SELECT round( myfield, 18 ) FROM mytable

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

...