2013-02-03 14 views
6

È possibile scrivere query SQL utilizzando DELPHI, componenti DB dbgo e un server di database SQL Server che sono limitati rispetto al tempo di elaborazione?Interruzione query SQL con limite di tempo di processo

Come

select * from table where ...... 

e process_time_limit = 5 sec?

Meglio mi dai il 10% delle righe entro un limite di tempo, invece di ore di attesa per il set di dati di query completa

+0

Cosa vuoi che accada quando è stato raggiunto 5 secondi? Un'eccezione che puoi gestire o qualcos'altro? E che edizione stai usando (forse Resource Governor può aiutarti qui). –

+0

Vedere anche http://stackoverflow.com/questions/5077051/ado-components-commandtimeout - 'CommandTimeout' può essere d'aiuto ma può dipendere da un paio di altri fattori. –

+3

Forse dovresti evitare di iniziare query che richiedono ore per essere completate. –

risposta

3

ADO componenti:

darei una prova per i dati asincrono recupero. Quando eseguirai la query, ti ricorderai quando hai iniziato e ogni volta che l'evento OnFetchProgress si attiva, controllerai se lo EventStatus è ancora nello stato esOK e controlla il tempo trascorso dall'esecuzione della query. Se è scaduto, è possibile annullare il recupero dei dati utilizzando il metodo Cancel sul set di dati.

volevo usare qualcosa come il seguente pseudocodice (non testato):

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; 
+0

Hmm, il documento per "Annulla" dice: "Annulla le modifiche al record attivo se tali modifiche non sono ancora state pubblicate." Sei sicuro che funzionerebbe per lo scopo previsto qui - per annullare il prossimo recupero? – ain

+1

Grazie a questa idea di condivisione, mi dispiacerebbe – Franz

Problemi correlati