ADO घटक घंटे प्रतीक्षा करने के एक समय सीमा के भीतर पंक्तियों का 10% दे:
मैं अतुल्यकालिक डेटा को एक कोशिश देना होगा लाने। जब आप क्वेरी निष्पादित करेंगे, तो आपको याद होगा कि आपने कब शुरू किया है और हर बार OnFetchProgress
ईवेंट आग लगती है, तो आप जांचेंगे कि EventStatus
अभी भी esOK
स्थिति में है और क्वेरी निष्पादन से समाप्त समय की जांच करें। यदि यह समाप्त हो गया है, तो आप अपने डेटासेट पर Cancel
विधि का उपयोग करके डेटा फ़ेच रद्द कर सकते हैं।
मैं निम्नलिखित (untested) स्यूडोकोड की तरह कुछ का उपयोग करने के लिए होती:
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;
क्या आप जब 5 सेकंड तक पहुँच गया है हो करना चाहते हैं? एक अपवाद जिसे आप संभाल सकते हैं, या कुछ और? और आप किस संस्करण का उपयोग कर रहे हैं (शायद संसाधन गवर्नर यहां मदद कर सकते हैं)। –
यह भी देखें कि http://stackoverflow.com/questions/5077051/ado-components-commandtimeout - 'कमांडटाइमआउट' मदद कर सकता है लेकिन यह कुछ अन्य कारकों पर निर्भर हो सकता है। –
हो सकता है कि आपको उन प्रश्नों को शुरू करने से बचना चाहिए जो पूर्ण होने में घंटों लगते हैं। –