Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ассинхронное выполнение процедуры, ADOConnection1.Execute/ADOQuery1.ExecSQL 
:(
    Опции темы
Dolphinchik
Дата 7.9.2007, 04:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 24.7.2006
Где: Филлипины

Репутация: нет
Всего: нет



Здравствуйте, 
на определенном этапе работы программы мне необходимо запустить по очереди несколько процедур.
К примеру:

Код

ADOConnection1.Connected:=false;
ADOConnection1.ConnectOptions:=coAsyncConnect;
ADOConnection1.CursorLocation:=clUseClient;
ADOConnection1.IsolationLevel:=ilUnspecified;
ADOConnection1.Connected:=true;
ADOConnection1.Execute('exec  proc_a  @param_a=''param_a'' ', cmdText, [eoAsyncExecute,eoAsyncFetch,eoAsyncFetchNonBlocking]);
//здесь необходимо отловить что закончилось выполнение процедуры
//так как в противном случае будет ошибка Operation cannot be performed while executing asynchronously. 
ADOConnection1.Execute('exec proc_b  @param_b=''param_b'' ', cmdText, [eoAsyncExecute,eoAsyncFetch,eoAsyncFetchNonBlocking]);
//здесь необходимо отловить что закончилось выполнение процедуры
//так как в противном случае будет ошибка Operation cannot be performed while executing asynchronously. 





У ADOConnection1 есть события: OnWillExecute и OnExecuteComplete.
Первое вызывается перед началом исполнения команды, второе по завершению команды.
У OnExecuteComplete есть EventStatus: TEventStatus, может принимать значения:
  TEventStatus = (esOK, esErrorsOccured, esCantDeny, esCancel, esUnwantedEvent);
Когда TEventStatus=esOK - процедура закончила исполнение;

Как правильно здесь поступить?
Как заставить программу ожидать выполнения процедуры?
Я предполагаю несколько вариантов:
1. Средствами ADODB: где-то есть возможность все это правильно оформить; 
2. Можно в OnExecuteComplete и OnWillExecute поместить булевую переменную и выполнять while до тех пор пока она не получит значение, которое присваевается ей в OnExecuteComplete. Только приложение вешается, а это именно то от чего я хочу избавиться. Сначало я пробовала CursorLocation в состоянии clUseServer, клиент подвисает напроч. 
3. Можно воспользоваться winapi.

Что можете посоветовать?

Delphi 7,  MS SQL Server, MDAC 2.8

Добавлено через 3 минуты и 49 секунд
небольшая поправка -  "Когда TEventStatus=esOK - процедура закончила исполнение;" - не факт
PM MAIL MSN   Вверх
Savek
Дата 7.9.2007, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 10.4.2006
Где: Воронеж

Репутация: 7
Всего: 7



А дополнительные потоки использовать религия не позволяет?
PM MAIL   Вверх
Dolphinchik
Дата 8.9.2007, 07:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 24.7.2006
Где: Филлипины

Репутация: нет
Всего: нет



видимо не позволяет :(
PM MAIL MSN   Вверх
Savek
Дата 8.9.2007, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 10.4.2006
Где: Воронеж

Репутация: 7
Всего: 7



получается что с одной стороны выполнение процедуры должно быть асинхронным, а сдругой программа должна ожидать завершения smile Попробуй в цикле while крутить строку Application.ProcessMessage.

Только эта пляска с бубном кроме геморроя ничего не даст. Доп. потоки для того и созданы, чтобы выполнять длительные операции, не замораживая интерфейс пользователя (ИМХО)
PM MAIL   Вверх
Dolphinchik
Дата 10.9.2007, 07:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 24.7.2006
Где: Филлипины

Репутация: нет
Всего: нет



одногрупнег посоветовал статью  smile 
http://forum.vingrad.ru/forum/topic-60076.html
PM MAIL MSN   Вверх
Arvest
Дата 13.9.2007, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 13.6.2007

Репутация: нет
Всего: нет



По забжу возник вопрос.
Код

try
    Form1.ADOStoredProc1.ExecProc;
    ind:=True;
    While ind  do
       begin
         sleep(100);
         Application.ProcessMessages;
       end;
except
     on E: Exception do begin
     Application.ShowException(E);
     end;

Вызывается запрос из базы Access.
Если синтаксис запроса не верен, то должна выскакивать ошибка. (например в запросе присутсвует функция NZ)
При eoAsyncExecute = False так и происходит.
Но если eoAsyncExecute = True , то запрос как будто выполняется. Т.е. никаких эксепшинов не возникает, но результата запроса нет (Запрос Update).
Это фича? Как можно добиться обработки эксепшинов при асинхронном выполнения ADOStoredProc?
Заранее спасибо за ответ.

Это сообщение отредактировал(а) Arvest - 13.9.2007, 11:34
PM MAIL   Вверх
Savek
Дата 13.9.2007, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 10.4.2006
Где: Воронеж

Репутация: 7
Всего: 7



Если не ошибаюсь, ошибки можно ловить здесь:
Код

procedure TForm1.ADOConnection1ExecuteComplete(Connection: TADOConnection;
  RecordsAffected: Integer; const Error: Error;
  var EventStatus: TEventStatus; const Command: _Command;
  const Recordset: _Recordset);
begin
ShowMessage(error.Description);
end;


PM MAIL   Вверх
Arvest
Дата 13.9.2007, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 13.6.2007

Репутация: нет
Всего: нет



Savek, Огромное Спасибо!
Но если возвращаясь к вопросу, то это действительно фича?

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0463 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.