Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2014.08.31;
Скачать: [xml.tar.bz2];

Вниз

Отмена асинхронного 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.002 c
2-1380735763
zibert
2013-10-02 21:42
2014.08.31
типы


15-1384200085
Kerk
2013-11-12 00:01
2014.08.31
Конкурс про Delphi for Android


15-1391254319
xayam
2014-02-01 15:31
2014.08.31
Проводник для больших папок


3-1300364942
OW
2011-03-17 15:29
2014.08.31
Позиционировать курсор после удаления и переоткрытия DS


15-1391235534
Gendalf
2014-02-01 10:18
2014.08.31
Все мы немножко волшебники... ;)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский