Форум: "Базы";
Текущий архив: 2002.01.17;
Скачать: [xml.tar.bz2];
ВнизFloating point invalid operation Найти похожие ветки
← →
aleXXoft (2001-12-13 14:32) [0]Приветствую!
Прежде, чем задам вопрос, расскажу как всё было...
Есть серверок с базулькой. Сервер - Linux, базулька - Oracle. Пишу клиент для Выни на Дэльфи-5. Oracle Client использую версии 8.1.7.
Всё написал. Работает.
Решил провести "регламентные работы" (много хламу накопилось да и ваще) и проинсталил комп заново (всё тоже самое: от винды2000 до Дэльфи-5 с БДЕ 5.1.1).
Запускаю Дэльфи. Проект компилится, запускается, но... не работает!
Когда я анализирую данные (выполнив SQL-запрос) вылетает ошибка
"Floating Point Invalid Operation". Поля, которые принимают участие в анализе имеют тип INTEGER. Могуть быть NULL. При проверке на IsNull выдаётся FALSE, но при попытке получить значение (например, "i:=DS.FieldByName("counter_value").AsInteger") вылетает вышенаписанная ошибка. По идее, можно и не делать проверку на IsNull, т.к. у меня переменная i преобразуется затем в строку, а тут мы знаем, что если в поле находится NULL, то функция AsString вернёт пустую строку (для меня это не фатально), а если находится ноль, то и вернётся ноль (т.е. AsString="0").
В моём же случае, когда в поле находится NULL возвращается какое-то неимоверно большое (или, наоборот, маленькое) значение, которое ну никак не укладывается в INTEGER (причём оно "чем-то" очень "напоминает" значение с плавающей точкой и огромной степенью).
Так вот, что самое интресное, так это то, что ДО ЭТОГО всё работало! То есть при проверке на IsNull выходило TRUE! Что за хрень?
Кстати, на соседнем компе всё работает до сих пор (там установлен тот же самый софт!).
В принципе, я понимаю почему вылазит именно "Floating Point Invalid Operation". При выполнении функции AsInteger выполняется функция AsFloat, а затем происходит округление. Так вот при округлении полученного функцией AsFloat значения возникает исключение FPU "Invalid Operation". Я посмотрел, что возвращает функция AsFloat. Она возвращает то же, что возвращает функция AsString (только, естественно, не в строковом виде). То есть число с огромной степенью (меньшее/большее по модулю, чем 1e-18/1e18). То есть, собственно, возвращет тот самый NULL, на который должна была обратить внимание функция IsNull.
Так вот главный вопрос: ПОЧЕМУ ФУНКЦИЯ ISNULL НЕПРАВИЛЬНО РАБОТАЕТ?
Или в более общей форме: КАКОГО РОЖНА ВООБЩЕ ТАК ПРОИСХОДИТ?
%(
С приветом, aleXXoft
Успехов!
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.01.17;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.004 c