Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.03.2009, 14:11   #1
cherry25
Форумчанин
 
Регистрация: 16.02.2009
Сообщений: 110
По умолчанию DOA компоненты, как обойти ошибку?

Работаю с компонентами DOA в Delphi7. Возникла необходимость в ходе выполнения процедуры в цикле выловить 54 оракловскую ошибку (ORA-00054 "запись занята для редактирования"). При этом нужно эту запись просто пропустить и пойти далее по циклу. Попытка 1: пробовала при помощи try...except.. в процедуре поймать ее, но столкнулась с тем, что при попадании на редактируемую запись процесс зависал и через какое-то время выскакивала ошибка "время ожидания истекло" (на update на уровне базы выделяется время для возможности ее редактирования 30, 60с,..., после истечения этого времени, если пользователь ее не закрыл, появляется такое сообщение). Т.е. этот метод не приемлем, т.к. при наличи хотя бы 10 записей, открытых для редактирования, мой запрос будет работать минут на 10 дольше . Попытка 2: пробовала обработать отлов ошибки на событии OnTranslateMessage DataSet-a, в этом случае после попадания в это событие, вернуться обратно в процедуру, где находится мой цикл, уже не получается. Т.е. здесь уже ошибку нельзя обойти - процесс, так сказать, уже пошел. Может, посоветуете, что можно сделать в этом случае? Может, нужно использовать другое событие?
Заранее спасибо!
cherry25 вне форума Ответить с цитированием
Старый 02.03.2009, 15:18   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

А ты делай эти действия SQL командами, и пусть у провайдера голова болит, когда он на заблокированую запись попадает, а он умеет от такого изворачиваться (по себе знаю).
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.03.2009, 11:27   #3
cherry25
Форумчанин
 
Регистрация: 16.02.2009
Сообщений: 110
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А ты делай эти действия SQL командами, и пусть у провайдера голова болит, когда он на заблокированую запись попадает, а он умеет от такого изворачиваться (по себе знаю).
Если я правильно Вас поняла, то не получится. Немного подробнее опишу свою программу: Главный dataset выбирает из 10-15 таблиц записи (здесь уже не получится сделать в dataset-e запрос for update, что бы исключить редактируемые записи из выборки, да и некорректно это, их ведь могут открыть и после выбора). Далее в цикле иду по каждой из них, выполняя мелкие выборки и построчно перебрасываю данные в файл. Каждый раз перед тем как постить в файл строку я должна проверить ее на открытие для редактирования. Если она закрыта, то я переношу ее в файл и обновляю соотв поле признаком, что строка перенесена. Если же она открыта, то мне ее надо ПРОСТО ОБОЙТИ, не занося ее в файл и не обновляя признак. Я не вижу момента, где это можно сделать на уровне dataset-a. Если не правильно поняла, уточните, пожалуйста. Спасибо!
cherry25 вне форума Ответить с цитированием
Старый 03.03.2009, 12:50   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Насколько я знаю нормальные провайдеры сами проверяют стоит ли курсор на записи в которую постиш, и если стоит то либо не ывыполняют ничего либо кешируют.
Я так понял что у тебя Оракл - он должен такое сам проверять.
В крайнем случае можно так:
В цикле проходя по записи заключаеш Update в try-except и если запись заблокирована можно обработать ошибку или просто пропустить эту запись.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.03.2009, 08:42   #5
cherry25
Форумчанин
 
Регистрация: 16.02.2009
Сообщений: 110
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Насколько я знаю нормальные провайдеры сами проверяют стоит ли курсор на записи в которую постиш, и если стоит то либо не ывыполняют ничего либо кешируют.
Я так понял что у тебя Оракл - он должен такое сам проверять.
В крайнем случае можно так:
В цикле проходя по записи заключаеш Update в try-except и если запись заблокирована можно обработать ошибку или просто пропустить эту запись.
Спасибо за помощь, я уже обошла этот момент.

Цитата:
Сообщение от Stilet Посмотреть сообщение
В цикле проходя по записи заключаеш Update в try-except и если запись заблокирована можно обработать ошибку или просто пропустить эту запись.

У меня не получалось именно так и сделать. Рекурсия все спасла .
cherry25 вне форума Ответить с цитированием
Старый 07.03.2009, 13:36   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от cherry25
Спасибо за помощь, я уже обошла этот момент.
Если не секрет - поделитесь, пожалуйста, как обошли?

С ПРАЗДНИКОМ 8-го Марта!
Любви, Здоровья, Удачи и Счастья!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.03.2009, 13:26   #7
cherry25
Форумчанин
 
Регистрация: 16.02.2009
Сообщений: 110
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Если не секрет - поделитесь, пожалуйста, как обошли?

С ПРАЗДНИКОМ 8-го Марта!
Любви, Здоровья, Удачи и Счастья!
Добрый день! Не секрет, конечно . Выше я немного описАла свою задачу - мне нужно обновить поле в базе (признак того, что я поработала с этой строкой). При этом запись может быть открыта в этот момнет другим пользователем для редактирования. Первый шаг - в DataSet-e я сделала запрос через Select и обновляла поле уже методами Delphi (вместо Update SQL). В Select-e в конце обязательно нужно добавить for update nowait. Это позволяет обойти временную задержку (выше описано, что на строке, закрытой для записи, мой запрос висел в течение минуты). Но проблема была еще в том, что я не могла найти событие, в котором бы ошибку еще можно было остановить. К сожалению, я его так и не нашла, поэтому сделала по-другому, с помощью рекурсии. В отдельную процедуру с параметром n(счетчик в цикле) я вынесла свой цикл и в try... except выполняю обновление, если вдруг запись закрыта, то я в except вызываю эту же процедуру с параметром n+1, т.е. пропуская эту строку. Этот метод сработал. Не знаю, может, можно было еще каким-то способом это сделать, но я на тот момент перепробовала столько вариантов, что уже не было никакого желания это делать
cherry25 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обойти пароль в 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