Форум: "Основная";
Текущий архив: 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