処理時間に関して制限されているDELPHI、dbgo DBコンポーネント、およびSQL Serverデータベースサーバーを使用してSQLクエリを記述できますか?
好き
select * from table where ......
とprocess_time_limit = 5 sec
?
完全なクエリデータセットを何時間も待つのではなく、制限時間内に行の10%を指定することをお勧めします
処理時間に関して制限されているDELPHI、dbgo DBコンポーネント、およびSQL Serverデータベースサーバーを使用してSQLクエリを記述できますか?
好き
select * from table where ......
とprocess_time_limit = 5 sec
?
完全なクエリデータセットを何時間も待つのではなく、制限時間内に行の10%を指定することをお勧めします
ADO コンポーネント:
非同期データフェッチを試してみます。クエリを実行すると、いつ開始したかを思い出し、OnFetchProgress
イベントが発生するたびに、EventStatus
がまだesOK
状態にあるかどうかを確認し、クエリの実行からの経過時間を確認します。経過した場合は、データセットでCancel
メソッドを使用してデータ フェッチをキャンセルできます。
次の(テストされていない)擬似コードのようなものを使用するつもりでした:
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;