|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
02.03.2009, 14:11 | #1 |
Форумчанин
Регистрация: 16.02.2009
Сообщений: 110
|
DOA компоненты, как обойти ошибку?
Работаю с компонентами DOA в Delphi7. Возникла необходимость в ходе выполнения процедуры в цикле выловить 54 оракловскую ошибку (ORA-00054 "запись занята для редактирования"). При этом нужно эту запись просто пропустить и пойти далее по циклу. Попытка 1: пробовала при помощи try...except.. в процедуре поймать ее, но столкнулась с тем, что при попадании на редактируемую запись процесс зависал и через какое-то время выскакивала ошибка "время ожидания истекло" (на update на уровне базы выделяется время для возможности ее редактирования 30, 60с,..., после истечения этого времени, если пользователь ее не закрыл, появляется такое сообщение). Т.е. этот метод не приемлем, т.к. при наличи хотя бы 10 записей, открытых для редактирования, мой запрос будет работать минут на 10 дольше . Попытка 2: пробовала обработать отлов ошибки на событии OnTranslateMessage DataSet-a, в этом случае после попадания в это событие, вернуться обратно в процедуру, где находится мой цикл, уже не получается. Т.е. здесь уже ошибку нельзя обойти - процесс, так сказать, уже пошел. Может, посоветуете, что можно сделать в этом случае? Может, нужно использовать другое событие?
Заранее спасибо! |
02.03.2009, 15:18 | #2 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
А ты делай эти действия SQL командами, и пусть у провайдера голова болит, когда он на заблокированую запись попадает, а он умеет от такого изворачиваться (по себе знаю).
I'm learning to live...
|
03.03.2009, 11:27 | #3 |
Форумчанин
Регистрация: 16.02.2009
Сообщений: 110
|
Если я правильно Вас поняла, то не получится. Немного подробнее опишу свою программу: Главный dataset выбирает из 10-15 таблиц записи (здесь уже не получится сделать в dataset-e запрос for update, что бы исключить редактируемые записи из выборки, да и некорректно это, их ведь могут открыть и после выбора). Далее в цикле иду по каждой из них, выполняя мелкие выборки и построчно перебрасываю данные в файл. Каждый раз перед тем как постить в файл строку я должна проверить ее на открытие для редактирования. Если она закрыта, то я переношу ее в файл и обновляю соотв поле признаком, что строка перенесена. Если же она открыта, то мне ее надо ПРОСТО ОБОЙТИ, не занося ее в файл и не обновляя признак. Я не вижу момента, где это можно сделать на уровне dataset-a. Если не правильно поняла, уточните, пожалуйста. Спасибо!
|
03.03.2009, 12:50 | #4 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Насколько я знаю нормальные провайдеры сами проверяют стоит ли курсор на записи в которую постиш, и если стоит то либо не ывыполняют ничего либо кешируют.
Я так понял что у тебя Оракл - он должен такое сам проверять. В крайнем случае можно так: В цикле проходя по записи заключаеш Update в try-except и если запись заблокирована можно обработать ошибку или просто пропустить эту запись.
I'm learning to live...
|
06.03.2009, 08:42 | #5 | ||
Форумчанин
Регистрация: 16.02.2009
Сообщений: 110
|
Цитата:
Цитата:
У меня не получалось именно так и сделать. Рекурсия все спасла . |
||
07.03.2009, 13:36 | #6 | |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Цитата:
С ПРАЗДНИКОМ 8-го Марта! Любви, Здоровья, Удачи и Счастья! |
|
10.03.2009, 13:26 | #7 |
Форумчанин
Регистрация: 16.02.2009
Сообщений: 110
|
Добрый день! Не секрет, конечно . Выше я немного описАла свою задачу - мне нужно обновить поле в базе (признак того, что я поработала с этой строкой). При этом запись может быть открыта в этот момнет другим пользователем для редактирования. Первый шаг - в DataSet-e я сделала запрос через Select и обновляла поле уже методами Delphi (вместо Update SQL). В Select-e в конце обязательно нужно добавить for update nowait. Это позволяет обойти временную задержку (выше описано, что на строке, закрытой для записи, мой запрос висел в течение минуты). Но проблема была еще в том, что я не могла найти событие, в котором бы ошибку еще можно было остановить. К сожалению, я его так и не нашла, поэтому сделала по-другому, с помощью рекурсии. В отдельную процедуру с параметром n(счетчик в цикле) я вынесла свой цикл и в try... except выполняю обновление, если вдруг запись закрыта, то я в except вызываю эту же процедуру с параметром n+1, т.е. пропуская эту строку. Этот метод сработал. Не знаю, может, можно было еще каким-то способом это сделать, но я на тот момент перепробовала столько вариантов, что уже не было никакого желания это делать
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как обойти пароль в Windows XP? | tonich | Безопасность, Шифрование | 30 | 15.11.2011 18:11 |
Как зарегистрировать DOA | rost | Компоненты Delphi | 0 | 08.09.2008 10:44 |
Помошите найти не жадный DOA 4.0.7, для Delphi 6.0 | Lis | БД в Delphi | 0 | 06.11.2007 15:09 |
Обойти ХТТП:// .... | _Solomon_ | Работа с сетью в Delphi | 1 | 28.03.2007 10:08 |