Procedure canceled | |
---|---|
Naomi Автор Сообщений: 1796 Дата регистрации: 09.10.2003 |
I'm trying to use try/catch with update/insert commands and I have triggers in the database.
My code is very simple:
However, instead of my error I'm getting "Procedure Canceled". Is it a known bug? Thanks a lot in advance. |
Re: Procedure canceled | |
---|---|
Владимир Максимов Сообщений: 14100 Откуда: Москва Дата регистрации: 02.09.2000 |
VFP8SP1
Создал табличку
Все прошло "штатно". Получил "error" Далее изменил код триггера на такой
При попытке выполнения кода получил ошибку "Procedure Canceled". Опять изменяю код триггера на
Следовательно. Ошибка возникает, если внутри вложенной Try...Catch есть команды RETURN. |
Re: Procedure canceled | |
---|---|
Naomi Автор Сообщений: 1796 Дата регистрации: 09.10.2003 |
Very good observation! May be you're right. In my trigger (actually, it's Steve Sayer's trigger _ri_handler) there are RETURN statements. There is also ON ERROR inside the trigger. So, all of them together may cause this problem. Yesterday I made some changes in the _ri_handler, so it would not fail if I'm passing NULLs for the foreign keys. Now my code works fine as it is, e.g. I'm not getting an error. But my trigger is not returning .f. I may try to pass the wrong FK in order for this trigger to fail and I bet I would have the same "procedure canceled" error. So, I think, if the trigger tries to RETURN .f., it gives this error. Do you think it's a VFP bug? Can you or somebody else test it in VFP9?
Thanks a lot again. You're very helpful. |
Re: Procedure canceled | |
---|---|
Naomi Автор Сообщений: 1796 Дата регистрации: 09.10.2003 |
I've created a new thread RI builder - what we had discovered Thread #1000705 Message #1000705 in UniversalThread, where I put all my thoughts on the matter. Take a look, please.
|
Re: Procedure canceled | |
---|---|
Владимир Максимов Сообщений: 14100 Откуда: Москва Дата регистрации: 02.09.2000 |
Дело не в том, что возвращается RETURN .F., а сам принцип: во вложенном Try...Catch встречается команда RETURN. Я изменил код триггера на такой:
Вообще-то, лично я стараюсь по возможности делать только одну точку выхода из процедуры (только одну команду RETURN) Проверил в VFP9 (release). В нем такой проблемы нет. Все работает нормально. Т.е., скорее всего, это действительно bug VFP8, который "по тихому" исправили в 9 версии. Кстати, сделал простейшую программку
И в VFP8 и в VFP9 это вызывает ошибку. Т.е. команда RETURN внутри конструкции Try...Catch - это запрещенная команда. Хотя, об этом не сказано ни слова в HELP PS: На UT я стараюсь вообще не заходить. Мне очень тяжело читать по английски. |
Re: Procedure canceled | |
---|---|
Naomi Автор Сообщений: 1796 Дата регистрации: 09.10.2003 |
Vladimir,
Thanks a lot. I'm going to think about all of this during this weekend. Didn't do anything useful for the whole day anyway |
Re: Procedure canceled | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Hi Владимир!
Раздел хелпа Structured Error Handling есть и в хелпе от 8-ки и от 9-ке. Там явно прописан запрет на использование RETURN внутри конструкции TRY (во всех 3-х её частях). А ошибка Procedure Canceled судя по всему генерируется тогда, когда в ХП некому обработать ошибку (в частности размещение RETURN внутри TRY производит ошибку в контексте "ВНЕ" этого блока). т.е. обработать её некому - а значит процедуру по тихому "убивают". P.S. Со старой схемой "ON ERROR" внутри ХП очевидно уже пора покончить - т.к. она НЕ работает во многих случаях вызова кода этой самой ХП... А вот TRY CATCH - это самое то, но только безукоризненно написанные! Т.е. не генерирующие ошибки сами по себе! Ибо ошибки в обработчике ошибок тогда уже некому будет ловить... (Или есть кому, но крайне убого и совершенно неправильно! т.е. не отражая самой сути возникшей ошибки) ------------------ WBR, Igor |
Re: Procedure canceled | |
---|---|
Naomi Автор Сообщений: 1796 Дата регистрации: 09.10.2003 |
Спасибо. Я думаю, я буду переписывать _ri_Handler и попробую избежать всех этих проблем.
|
Re: Procedure canceled | |
---|---|
Naomi Автор Сообщений: 1796 Дата регистрации: 09.10.2003 |
I am thinking, may be we can create a nice 100% bullet-proof _ri_handler? I'm looking at home.twmi.rr.com and the link to here from that link. Still that code needs couple of improvements. I'm going to work on it today and then will post it here so we all can come up with the good generic RI builder. I have another idea. In some cases we need to allow NULLs to be FK and in some we don't. So, my RI builder should have additional flag for that and a parameter.
|
Re: Procedure canceled | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Hi Nadya_N!
В общем случае триггер и не должен проверять на NULL - т.е. он должен работать исходя из ДОПУСТИМОСТИ NULL в FK - а если реально там NULL не допустим - то это должно отлавливаться ограничением NOT NULL на поле FK. Вот что IMHO стоит добавить в RI - так это действие Nullify (зануление FK при смене/удалении PK), проверку (и по возможности поддержание хотя-бы каких-то действий) для ситуации рекурсивной связи (самосвязанная таблица). ------------------ WBR, Igor |
Re: Procedure canceled | |
---|---|
Naomi Автор Сообщений: 1796 Дата регистрации: 09.10.2003 |
Bellow is the code I have so far. I would appreciate your comments and suggestions as how to improve it and fix it. I would prefer to be able to avoid macros and define constants, because I want to make it Ole DB/ODBC compatible. Anyway, here is a first attempt, you may critigue it (but try to be nice < g > )
Post Edited (04-05-05 19:07)[/color] ------------------ |
Re: Procedure canceled | |
---|---|
Владимир Максимов Сообщений: 14100 Откуда: Москва Дата регистрации: 02.09.2000 |
Для определения типа триггера внутри тела триггера я пользуюсь таким способом
Не понял про глюк с мемо-полями. Можно примерчик, когда это происходит? Остальное чуть попозже посмотрю... |
Re: Procedure canceled | |
---|---|
Naomi Автор Сообщений: 1796 Дата регистрации: 09.10.2003 |
Your logic doesn't seem to be 100% correct. What if we change deleted record? This is possible. Regarding memo bug I'm not sure. I took this code from Doug Henning's site and just slightly modified.
|
Re: Procedure canceled | |
---|---|
Владимир Максимов Сообщений: 14100 Откуда: Москва Дата регистрации: 02.09.2000 |
Дело в том, что триггера срабатывают не всегда.
Ситуации, когда ни один триггер не сработает
При этом, изменения в этих записях, тем не менее попадут в таблицу. Т.е., с точки зрения триггера, запись, помеченная как удаленная, физически не существует. Поэтому и не обрабатывается. Если как "ДО", так и "После" модификации, с точки зрения триггера, записи не существовало, то нет смысла выполнять какую-то обработку. Отредактировано (05.04.05 22:23) ------------------ |
Re: Procedure canceled | |
---|---|
Naomi Автор Сообщений: 1796 Дата регистрации: 09.10.2003 |
Interesting! 1) would mean, that we can put any garbage into already deleted records, right?
|
Re: Procedure canceled | |
---|---|
Владимир Максимов Сообщений: 14100 Откуда: Москва Дата регистрации: 02.09.2000 |
Цитата:ДА! Более того, даже RULE не срабатывают в подобных ситуациях. Запись удалена - и делайте с ней что хотите. |
Re: Procedure canceled | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Hi Nadya!
IMHO самая серьёзная проблема приведенного кода (как впрочем и кода создаваемого штатным RI Buider-ом) - это обработка ошибок - к сожалению ON ERROR в триггере крайне плохо стыкуется со всеми прочими обработчиками ошибок (они банально перехватывают у него управление)... Идеальным решением было бы использование try ... catch блока в триггере, но вот он то как раз и не позволителен для OLE DB провайдера Вот и получается замкнутый круг - что хорошо для провайдера - не годится для прямого доступа, и наоборот... P.S. Не знал, что макро в триггерах не работают через OLE DB провайдер Это существенный минус - теперь понятно, почему RI построитель такой огромный и убогий код делает ------------------ WBR, Igor |
Procedure cancelled | |
---|---|
Naomi Автор Сообщений: 1796 Дата регистрации: 09.10.2003 |
I think I was actually wrong about macros. At least, I do not see them in the list of unsupported commands. Here is the link:msdn.microsoft.com
BTW, I was trying to optimize that code for quite a while, because it was dog slow. Here is my latest code, I still would very much appreciate all your comments. (In the RI builder I create a table called RIDefinitions, the structure is clear from the code bellow).
|
Re: Procedure cancelled | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Hi Nadya!
Ситуация с OLE DB и тем паче ODBC вообще плачевная - я посмотрел и пришёл к выводу, что разобраться в этой "нечеловеческой" логике практически невозможно. Да макро формально разрешены - как для ODBC так и для OleDB - но они НЕ работают - происходит Feature not avaliable (оно может при этом ловится обработчиком по ON ERROR !) - а вот на ON ERROR &lcOldError - скажем не ругается Доходит до маразма - скажем если в Rule висит какая-то проверка, и она содержит макро И окружена простейшим обработчиком ошибок - то становится возможным в таблицу внести данные, противоречащие этому правилу В самой среде это невозможно - мы скорее зациклимся на ошибочном состоянии (окно с Cancel, потом с Revert и так по кругу)... Насчёт #DEFINE - хотя для меня это полная загадка, но они реально не работают в ODBC но вроде проходят через OLE DB - странно тут то, что я всегда полагал, что фокс работает по ObjCode в соответствующей записи вис - а там никаких #DEFINE и в помине нету! А он видимо где-то "внутрях" производит перекомпиляцию ?!?! исходного текста ХП... В общем то надо было бы поглубже покопаться, да времени увы нет - эти тесты и так пол-дня отъели ------------------ WBR, Igor |
Re: Procedure cancelled | |
---|---|
Naomi Автор Сообщений: 1796 Дата регистрации: 09.10.2003 |
Igor,
Thanks a lot for your tests. I'm still trying to optimize this procedure. My latest idea was to put all command in the table and evaluate them on the fly. However, it seems like I'm going in circle, e.g. all my latest optimization ideas actually slow this stupid thing down. I spent already ~ 1+ week working on RI and testing-re-testing again and again... I started bunch of threads on UT describing my attempts and got lots of advices, half of them I tried with the negative result |
© 2000-2024 Fox Club  |