2013-02-03 6 views
6

क्या मैं DELPHI, dbgo डीबी घटकों और SQL सर्वर डेटाबेस सर्वर का उपयोग कर SQL क्वेरी क्वेरी लिख सकता हूं जो प्रक्रिया समय के संबंध में सीमित हैं?प्रक्रिया समय सीमा के साथ SQL क्वेरी निरस्त करें

तरह

select * from table where ...... 

और process_time_limit = 5 sec

?

बेहतर तुम मुझे के बजाय पूरा क्वेरी डेटासेट के लिए

+0

क्या आप जब 5 सेकंड तक पहुँच गया है हो करना चाहते हैं? एक अपवाद जिसे आप संभाल सकते हैं, या कुछ और? और आप किस संस्करण का उपयोग कर रहे हैं (शायद संसाधन गवर्नर यहां मदद कर सकते हैं)। –

+0

यह भी देखें कि http://stackoverflow.com/questions/5077051/ado-components-commandtimeout - 'कमांडटाइमआउट' मदद कर सकता है लेकिन यह कुछ अन्य कारकों पर निर्भर हो सकता है। –

+3

हो सकता है कि आपको उन प्रश्नों को शुरू करने से बचना चाहिए जो पूर्ण होने में घंटों लगते हैं। –

उत्तर

3

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

हम्म, 'रद्द करें' के लिए दस्तावेज़ कहता है: "यदि उन परिवर्तनों को अभी तक पोस्ट नहीं किया गया है तो सक्रिय रिकॉर्ड में संशोधन रद्द कर देता है।" क्या आप सुनिश्चित हैं कि यह उद्देश्य के उद्देश्य के लिए यहां काम करेगा - अगली fetch को रद्द करने के लिए? – ain

+1

इस विचार साझा करने पर धन्यवाद, मुझे इस पर एटीआई होगा – Franz

संबंधित मुद्दे