Запрос не хочет останавливаться!
От: shev  
Дата: 28.11.03 05:42
Оценка:
Здравствуйте!

Есть большая таблица (более 300 млн записей). Требуется банальная вещь — чтобы пользователь мог отменить запрос, посланный ранее.

Запускаю TADODataSet в асинхронном режиме. Смотрю в диспетчер задач — начинает увеличиваться размер потребляемой памяти (вообщем, все ок — данные идут). Вызываю метод Cancel — увеличение памяти прекратилось. Типа все завершилось как надо, записи перестали бежать. Подтверждение тому — событие OnFetchProgress — перестало срабатывать.
Но! Сервер продолжает усиленно работать (это по мигающим лампочкам винчестера видно). Проверяю в Enterprase Manager — у процесса статус runnable. Спустя нескольких минут, когда запрос все же отработает приходит сообщение OnFetchComplete.

Если попытаться еще раз послать запрос (до OnFetchComplete), то выскакивает Exception "Object was open".

Потестировав заметил, что длительность по времени от начала запуска запроса и до OnFetchComplete — одинаковое, независимо от того вызывается метод Cancel или нет. Хотя еще раз напомню, что при вызове Cancel записи действительно прекращают поступать на клиента. При этом, если абсолютно такой же запрос послать из QA и там прекратить его, то сервер мгновенно прекращает работу


DataSet: TADODataSet; 

procedure TForm1.btnStartClick(Sender: TObject); 
begin 
if DataSet.Active then 
DataSet.Close; 

DataSet.ExecuteOptions:=[eoAsyncExecute, eoAsyncFetch]; 

DataSet.CommandText:='select * from table1'; 
//запрос на самом деле с условием выборки, но в данном случае это не важно
DataSet.Open; 
end; 

procedure TForm1.btnStopClick(Sender: TObject); 
begin 
if DataSet.Recordset<>nil then 
begin 
DataSet.Recordset.Cancel; 
DataSet.Recordset.Close; 
end; 
end; 

procedure TForm1.DataSetFetchComplete(DataSet: TCustomADODataSet; 
const Error: Error; var EventStatus: TEventStatus); 
begin 
EventStatus:=esOK; 
memResult.Lines.Add('Выполнение запроса окончено'); 
end; 

procedure TForm1.DataSetFetchProgress(DataSet: TCustomADODataSet; Progress, 
MaxProgress: Integer; var EventStatus: TEventStatus); 
begin 
StatusBar.Panels[0].Text:='Записей: '+IntToStr(Progress); 
end;


Дак почему же он в действительности не останавливается?!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.