ADO składniki:
chciałbym spróbować do danych asynchroniczny sprowadzać. Po uruchomieniu zapytania zapamiętasz, kiedy uruchomisz i za każdym razem, gdy zostanie wywołane zdarzenie OnFetchProgress
, sprawdzisz, czy EventStatus
nadal znajduje się w stanie i sprawdza czas, jaki upłynął od wykonania zapytania. Jeśli upłynął, możesz anulować pobieranie danych przy użyciu metody Cancel
w swoim zestawie danych.
chciałem użyć coś jak poniżej (untested) Pseudokod:
var
FQueryStart: DWORD;
procedure TForm1.FormCreate(Sender: TObject);
begin
// configure the asynchronous data fetch for dataset
ADOQuery1.ExecuteOptions := [eoAsyncExecute, eoAsyncFetchNonBlocking];
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
// store the query execution starting time and execute a query
FQueryStart := GetTickCount;
ADOQuery1.SQL.Text := 'SELECT * FROM Table';
ADOQuery1.Open;
end;
procedure TForm1.ADOQuery1FetchProgress(DataSet: TCustomADODataSet; Progress,
MaxProgress: Integer; var EventStatus: TEventStatus);
begin
// if the fetch progress is in esOK (adStatusOK) status and the time since
// the query has been executed (5000 ms) elapsed, cancel the query
if (EventStatus = esOK) and (GetTickCount - FQueryStart >= 5000) then
DataSet.Cancel;
end;
Co chcesz zdarzyć, gdy została osiągnięta 5 sekund? Wyjątek, który możesz obsłużyć lub coś innego? I jakiej wersji używasz (może Resource Governor może pomóc tutaj). –
Zobacz także http://stackoverflow.com/questions/5077051/ado-components-commandtimeout - "CommandTimeout" może pomóc, ale może zależeć od kilku innych czynników. –
Może powinieneś unikać rozpoczynania zapytań, których wypełnienie zajmuje wiele godzin. –