![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отмена асинхронного 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;