ODP.net Oracle Десятичное число проблемы с точностью при заполнении набора данных. Исключение: арифметическая операция привела к переполнению

Я работаю в С#.net 2 (Visual Studio 2005 SP1), пытаясь заполнить набор данных результатами из select * из таблицы из базы данных Oracle10g. На этом сайте клиента можно изменить инфраструктуру .net, IDE и базу данных .

Я подключаюсь к провайдеру ODP.net, версия dll 2.102.2.20

Когда я запускаю команду fill, я получаю Exception:

Арифметическая операция привела к переполнению

Также, если я попытаюсь просмотреть столбец-нарушитель в дизайнере Visual Studio (Show Table Data), я получаю для каждой строки этого столбца в таблице. Код работает отлично, если мой запрос выбирает другие столбцы с целыми числами, например, опуская этот столбец.

Соответствующий столбец отлично выглядит, когда я просматриваю его в базе данных от Toad, данные выглядят следующим образом:

+919,742866695572

Мне нужна точность , как это требуется для моделирования monte carlo.

Если вместо использования адаптера данных для заполнения datatable я использую datareader и вызываю dataReader.getValue(columnIndex), я получаю ту же ошибку, но если я вызову dataReader.GetOracleDecimal(columnIndex), тогда я получу результат, который я ищу, нет ошибок.

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

Может ли кто-нибудь помочь? Могу ли я использовать новые версии DLL ODP.net для подключения к более старой базе данных Oracle10g? Мне интересно, поможет ли это.

Спасибо

Ответы

Ответ 1

Проблема заключается в том, что точность значения результата слишком велика для преобразования в System.Decimal без потери данных. Я забываю точное количество цифр, но это около 18 или около того. Допустимо ли round() значение результата для этого количества цифр? В примере, который вы указали, a round(MyColumn, 15) или так должно быть достаточно...

Ответ 2

Вы можете попробовать последнюю версию ODP.Net(11g). Это обратная совместимость. Я использую его для подключения к базе данных 10g просто отлично. Я думаю, что он должен работать и с VS 2005. Для развертывания clickonce просто добавьте DLL, на которые ссылается этот вопрос: Каков минимальный клиентский след, необходимый для подключения С# к базе данных Oracle? Важно отметить, что если у вас есть последняя версия odp.net, все DLL файлы включены в каталог установки. Вам не нужно скачивать мгновенный клиент отдельно. Просто найдите их.