Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отмена асинхронного Fetch


DmitriyG. ©   (2012-01-26 22:55:00) 

Для выборки записей (MSSQL) использую ADO с асинхронным выполнением запроса (eoAsyncExecute) и асинхронным получением записей (eoAsyncFetchNonBlocking)...
После того как запрос был выполнен и начинается Fetch записей бывает необходимость его остановить... Пробовал следующей командой:

 if ADOQuery.State <> dsInactive then
   ADOQuery.Recordset.Cancel;

  Но в случае если данных не очень много (менее 200.000), то соединение прерывается, но при этом данные по сети передаются...
   А если пробовать выбрать милионов 20 - то приложение перестает реагировать и данные по прежнему качаются... Как корректно прервать Fetch?


DmitriyG.   (2012-01-30 23:48:00) [1]

Нет не помогает... Запрос отменяется, но на сервере остается... Т.е. сеть загружена, данные продолжают Fetch'ится...
Кстати для отмены я использую - Command.Cancel.

Вот кусок кода...
IsStopped - просто переменная, устанавливаемая по нажатию на кнопку отмены...

procedure TfmRequestCancel.AsyncQuery(const connMain : TADOConnection; const queryMain : TADOQuery; const Request : string);
var
 cmd: TADOCommand;
 rst: _Recordset;
begin
 IsStopped := False;
 cmd := TADOCommand.Create(Self);
 try
   cmd.Connection := connMain;
   cmd.CommandText := Request;
   cmd.ExecuteOptions := [eoAsyncExecute, eoAsyncFetchNonBlocking];
   rst := cmd.Execute;
   while ((rst.State and adStateExecuting) = adStateExecuting) or
         ((rst.State and adStateFetching) = adStateFetching) do
   begin
     Application.ProcessMessages;
     if IsStopped then
     begin
       if rst.State = adStateExecuting then
         cmd.Cancel;
       if rst.State = (adStateFetching or adStateOpen) then
         rst.Close;
       break;
     end;
   end;
   //Если запрос был выполнен и не нажали отмену, то присоединяем данные
   if  not ((rst.State = adStateClosed) or IsStopped) then
     queryMain.Recordset := rst;
 finally
   cmd.Free;
 end;
end;


DmitriyG.   (2012-01-28 13:35:00) [2]

Спасибо... В понедельник попробую.... Чего-то до Close я не додумался :-)


sniknik   (2012-01-27 07:59:00) [3]

with ADODataSet1 do begin
 if Recordset.State = adStateExecuting
   then Cancel;
 if Recordset.State = (adStateFetching or adStateOpen)
   then Close;
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо