Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.08.31;
Скачать: CL | DM;

Вниз

Отмена асинхронного Fetch   Найти похожие ветки 

 
DmitriyG. ©   (2012-01-26 22:55) [0]

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

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

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


 
sniknik ©   (2012-01-27 07:59) [1]

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


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

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


 
DmitriyG. ©   (2012-01-30 23:48) [3]

Нет не помогает... Запрос отменяется, но на сервере остается... Т.е. сеть загружена, данные продолжают 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;



Страницы: 1 вся ветка

Текущий архив: 2014.08.31;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.004 c
2-1380574999
Delphi_Newbie
2013-10-01 01:03
2014.08.31
Устройства ввода


11-1196924275
hornet
2007-12-06 09:57
2014.08.31
Как уничтожить PDataSource


2-1380886196
Rezolik
2013-10-04 15:29
2014.08.31
tClientDataSet


2-1380884262
Вася
2013-10-04 14:57
2014.08.31
как освободить память после вызова функции?


2-1381237944
12345
2013-10-08 17:12
2014.08.31
получить строку