Exception в триггере
Exception в триггере
Как быть - при возбуждении EXCEPTION в триггере клиентом это воспринимается как "User Abort" (при возбуждении исключения в процедуре все нормально - возвращает номер исключения и нужное сообщение). Использую IBX Delphi 7, FireBird 1.0.3 сборка 972. Как добиться того, чтобы клиент получал номер exception и его сообщение?
Процедуры на выполнение я запускаю в базе через IBQuеry - в этом случае проблем нет - при возникновении Exception в процедуре я получаю его в клиенте в нормальном виде.kdv писал(а):...Сделайте try except и словите exception. Посмотрите на него в отладчике.
К таблицам я обращаюсь тоже через IBQuery, но с использованием IBUpdateSQL (кэширование изменений). Exception в триггере возникает (имеется ввиду, что если я его сам возбуждаю в триггере после проверки каких-то условий) при вызове ApplyUpdates компонента IBQuery - этот Exception я действительно ловлю в try ... except - но вижу только "User Abort" - как если бы я сам вызывал дельфийскую функцию Abort. Далее в части except я соответственно вызываю CancelUpdates компонента IBQuery - как и надо.
Причем, я это пробовал и отдельно от моего проекта на "пустом" проекте - с минимумом кода и компонентов, чтобы исключить какую-либо скрытую обработку (в реальном проекте много чего наворочено). Получил то же - "User Abort"... Попробуйте сами...
Такие вот пранблемы....
Последний раз редактировалось Narat 30 сен 2005, 16:41, всего редактировалось 1 раз.
Причем, я это пробовал и отдельно от моего проекта на "пустом" проекте - с минимумом кода и компонентов, чтобы исключить какую-либо скрытую обработку (в реальном проекте много чего наворочено). Получил то же - "User Abort"... Попробуйте сами...
Короче, как я понял, надо использовать IBDataSet. Спасибо за помощь...
Короче, как я понял, надо использовать IBDataSet. Спасибо за помощь...
CachedUpdates можно использовать независимо от компонент IBX. Вопрос в том, кто именно при applyUpdates жрет твой exception. я утверждаю что CU. Ты мне пытаешься доказать (?) обратное.
Собственно, найти достаточно легко. ApplyUpdates это метод IBCustomDataSet. Если его вызвать без включения CU - ты получишь ошибку (ibxeNotCachedUpdates). Соответственно все дальнейшее читается в коде этого метода,
ibxeUserAbort - это и есть тот самый sUserAbort = 'User Abort';
причем, если CU при ApplyUpdates не будет само обрабатывать ошибки с сервера, то тогда оно не сможет понять, что ПАКЕТ обновлений, отправленный на сервер, прошел неуспешно.
Где тут было "копать" вообще, а ? "Проблема" находится за 2 минуты. Кроме того, надо было тебе сразу читать про CU, а то ты меня своим триггером запутал.
Собственно, найти достаточно легко. ApplyUpdates это метод IBCustomDataSet. Если его вызвать без включения CU - ты получишь ошибку (ibxeNotCachedUpdates). Соответственно все дальнейшее читается в коде этого метода,
Код: Выделить всё
case UpdateAction of
uaFail:
IBError(ibxeUserAbort, [nil]);
причем, если CU при ApplyUpdates не будет само обрабатывать ошибки с сервера, то тогда оно не сможет понять, что ПАКЕТ обновлений, отправленный на сервер, прошел неуспешно.
Где тут было "копать" вообще, а ? "Проблема" находится за 2 минуты. Кроме того, надо было тебе сразу читать про CU, а то ты меня своим триггером запутал.