![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Исключение
zsnark © (2002-11-05 17:59:00)В приложении выполняется SQL-запрос к таблице Paradox, содержащей поля типа Number. На четырех из шести машин запрос выполняется и результирующая выборка достигается. На двух остальных при попытке в первый раз выполнить этот запрос вываливается исключение "Floating point overflow". При повторной попытке выполнения запроса с теми же параметрами выборка приходит успешно. Меняем параметры запроса и снова при его первом выполнении появляется данное исключение.
Я первым делом начал грешить на железо (у тех машин, на которых наблюдается глюк, примерно одинаковая конфигурация, отличающаяся от машин, на которых все в порядке)
Буду признателен за каждый ваш ответ.
zsnark (2002-11-07 10:36:00) [21]При попытке сделать явное приведение CAST выдается исключение о том, что данная возможность не поддерживается. "Capability not supported". Возможно это вследствие того, что используемый диалект не поддерживает явного приведения.
MsGuns (2002-11-06 18:28:00) [22]SELECT G.Gr, S.FIO, //строковые поле
sum(CAST(C.Nach as DECIMAL(12.2))- CAST(C.Oplach as DECIMAL(12.2)) //оба значения полей типа Number
и везде дальше вместо плав.поставь CAST(... as DECIMAL...)
zsnark (2002-11-06 17:48:00) [23]Подробности проблемы исключения с плавающей точкой.
Небольшое уточнение, не меняющее в принципе сути проблемы, в формулировке исключения "Invalid floating point operation" (прошу прощения, просто проблема давняя и даже подзабыл точный текст сообщения).
Метод Prepare перед запуском не стоял, но и его добавление не помогло.
Исключение происходит непосредственно при открытии запроса, а не
в момент инициализации параметров.
Текст запроса:
SELECT G.Gr, S.FIO, //строковые поле
sum(C.Nach - C.Oplach) //оба значения полей типа Number
FROM Gr.db as G, St.db as S, Crd.db as C
WHERE (G.GrID = S.GrID)and(S.StID = C.StID)
and(((S.PPID = 1)and(C.MID <= :edge1))
or((S.PPID = 2)and(C.MID <= :edge2))
or((S.PPID = 3)and(C.MID <= :edge3))
or((S.PPID = 4)and(C.MID <= :edge4)))
GROUP BY G.Gr, S.FIO
Впечатление такое, что это все из-за выражения в операторе WHERE
Но самое-то удивительное, что проект работает исправно на большинстве машин (достаточно мощных). Более того, даже на тех машинах на которых происходит подобный сбой при повторном запуске запроса (еще раз нажать на кнопку) выборка приходит, но печатный отчет в дальнейшем не создается. При смене параметров запроса, что делает клиент практически постоянно во время работы, снова возникает подобный сбой.
Max Zyuzin (2002-11-06 08:38:00) [24]А переполненеи происходит именно при выполнении запроса? Или при "где то рядом"? Например при задании параметров зпроса?
MsGuns (2002-11-05 20:20:00) [25]Query.Prepare есть перед запуском ?
И приведи текст запроса с указанием типа полей (в частности того, на котором переполнение.