इस एडीओ त्रुटि संदेश को गुगल करने से संकेत मिलता है कि यह आमतौर पर एएसपी.नेट विकास में सामना किया जाता है, लेकिन मुझे डेल्फी अनुप्रयोगों में होने पर बहुत अधिक उल्लेख नहीं मिला है। हमारे पास कुछ ग्राहक साइटें हैं जो क्षणिक नेटवर्क समस्याओं का सामना कर रही हैं, और यह लक्षण त्रुटि संदेश है। हम आसानी से कार्यालय परीक्षण में डुप्लिकेट कर सकते हैं; बस एक एमएस एसक्यूएल सर्वर सेवा बंद करते समय अपने डेल्फी TADOConnection उद्देश्य यह है कि सर्वर उदाहरण पर एक डेटाबेस से जुड़ा है और आप इस अपवाद: (? या आप करते हैं)डीबीएनईटीआईएल कनेक्शन कब ऑटो-रिकवर करें सामान्य नेटवर्क त्रुटि एडीओ कनेक्शन डेल्फी अनुप्रयोगों में ऑफ़लाइन जाने का कारण बनती है?
[DBNETLIB][ConnectionWrite (send()).]General network error. Check your network documentation.
हाँ, यह अपवाद को पकड़ने, और आप जानते कि यह त्रुटि हुई है। सिवाय इसके कि यह 10,000 केएलओसी + एप्लिकेशन है जिसमें 10,000 से अधिक प्रयास-डेटाबेस क्रियाओं के आसपास ब्लॉक को छोड़कर, इनमें से कोई भी इस त्रुटि से असफल हो सकता है।
TADOConnection
में कुछ त्रुटि घटनाएं हैं, जिनमें से कोई भी इस मामले में आग नहीं है। हालांकि, ऐसा होने पर एडीओ कनेक्शन स्वयं ही गलती हो जाती है, भले ही आप SQL डेटाबेस को पुनरारंभ करें, TADOConnection.Connected सत्य बनी हुई है, लेकिन यह आपके लिए झूठ बोल रही है। यह वास्तव में एक दोषपूर्ण राज्य में है।
तो फिर, मेरे सवाल यह है:
आप किसी भी तरह से है कि ब्लॉक को छोड़कर कोशिश 10,000 व्यक्ति में जा रहा है और कुछ वैश्विक स्थापित करने की तुलना में कम काम में इस गलती राज्य का पता लगाने, और यह से उबरने कर सकते हैं, "एडीओ ग्लोबल वैरिएबल पुनः कनेक्ट करें"?
मैं आशा करता हूं वहाँ, TADOConnection.ConnectionObject (अपरिष्कृत OLEDB कॉम ADO ऑब्जेक्ट) में जाने और इस गलती हालत मौजूद है जब हम एक नई क्वेरी शुरू कर रहे हैं पता लगाने के लिए, ताकि हम ADOConnection रीसेट और जारी रख सकते हैं एक तरीका है अगली बार जब हम एक क्वेरी चलाते हैं। चूंकि हमारा कोड इस तरह से व्यवस्थित किया गया है कि हमें "विफलता के बाद" इसे आसानी से पहचानने की इजाजत मिलेगी, इससे हमें 10 लाइन डेमो एप्लिकेशन में ऐसा करने की अनुमति मिल जाएगी।
This other SO question पूछता क्यों ऐसा होता है, कि नहीं क्या मैं पूछ रहा हूँ, कृपया मुझे देना नहीं है "रोकथाम" जवाब है, मैं उनके बारे में पहले से ही पता है, मैं एक वसूली और पहचान के- के लिए देख रहा हूँ अपवादों को पकड़ने के अलावा अन्य स्टॉल-एडीओ-कनेक्शन तकनीक। वास्तव में, यह अपवादों का गलत उदाहरण है; एडीओ इस विफलता मोड में एक schrodingers-cat वस्तु है।
मुझे एमएस नॉलेजबेस लेखों और इंटरनेट के चारों ओर तैरने वाले विभिन्न समाधानों से अवगत है। एक बार त्रुटि की स्थिति (जो अक्सर हमारी परिस्थितियों में क्षणिक होती है) को मंजूरी मिलने के बाद, मैं ग्राहक डेटा खोने के बिना रिकॉर्वरिंग के बारे में पूछ रहा हूं। इसका मतलब है कि हम अपने ऐप को फ्रीज करते हैं, ग्राहक को अपवाद दिखाते हैं, और जब ग्राहक पुनः प्रयास या जारी करते हैं, तो हम मरम्मत और जारी रखने का प्रयास करते हैं। ध्यान दें कि हमारा मौजूदा कोड लाखों प्रयास-को-लॉग-एंड-जारी कोड करता है, जो हमारे रास्ते में जा रहा है, इसलिए मैं किसी से यह जवाब देने की उम्मीद कर रहा हूं कि अनचाहे अपवादों के लिए एक एप्लिकेशन हैंडलर सबसे अच्छा तरीका है, लेकिन दुख की बात है हम इसका इस्तेमाल नहीं कर सकते। मुझे उम्मीद है कि हालांकि एक जमे हुए/दोषग्रस्त/मृत एडीओ कनेक्शन ऑब्जेक्ट का पता लगाना संभव है।
यहाँ मैं क्या है:
try
if fQueryEnable and ADOConnection1.Connected then begin
qQueryTest1.Active := false;
qQueryTest1.Active := true;
Inc(FQryCounter);
Label2.Caption := IntToStr(qQueryTest1.RecordCount)+' records';
end;
except
on E:Exception do begin
fQueryEnable := false;
Memo1.Lines.Add(E.ClassName+' '+E.Message);
if E is EOleException and Pos('DBNETLIB',E.Message)>0 then begin
ADOConnectionFaulted := boolean; { Global variable. }
end;
raise;
end;
end;
ऊपर समाधान के साथ समस्या यह है कि मैं अपने आवेदन में कॉपी और लगभग 10,000 स्थानों पेस्ट करना है।
कुछ एक TTimer और चयन @@ संस्करण और वैश्विक राज्य चर की तरह एक साधारण क्वेरी की तरह? – whosrdaddy
कभी भी इस समस्या का सामना नहीं करना पड़ा क्योंकि मैंने अपने सभी ऐप्स के लिए एक रैपर बनाया है जो इस तरह की स्थितियों को संभालता है। यदि आपको 10k स्थानों को बदलने की ज़रूरत है तो किंडा बेकार है :( – whosrdaddy
हाँ, एक "एडीओ वॉचडॉग" और फिर भी एक और बुरा टीटीमर। :-) –