Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обойти пароль в 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 16:09
Обойти ХТТП:// .... _Solomon_ Работа с сетью в Delphi 1 28.03.2007 10:08


12:02.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru