Номер Oracle к десятичному числу C#

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

Моя ситуация:
Я использую 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# от 'десятичного числа' для 'удваиваний' является также не действительно опцией.

Какие-либо идеи?

10
задан Kit 12 January 2017 в 23:29
поделиться

2 ответа

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

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

SELECT round( myfield, 18 ) FROM mytable

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

9
ответ дан 3 December 2019 в 16:29
поделиться

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

decimal d = (decimal)(OracleDecimal.SetPrecision(oraReader.GetOracleDecimal(0), 28));
16
ответ дан 3 December 2019 в 16:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: