2012-06-14 4 views
24

स्टैक ओवरफ्लो पर कई प्रश्न हैं जो ऐसे उत्तर हैं जो एडीओ/ओलेडीबी, डेल्फी टैडोक्वायर/टैडोकॉमैंड और पैरामीटर के विषय पर एक दूसरे के विरोधाभास करते हैं।कुछ मामलों में एडीओ घटक, विशेष रूप से TADOCommand, गैर-नामित, या नामित पैरामीटर के साथ अधिक विश्वसनीय रूप से काम करते हैं?

पैरामीटर को एडीओ घटक की कमांडटेक्स्ट या एसक्यूएल संपत्ति में दो तरीकों से पेश किया जा सकता है। मेरे लिए समय की

select a, b, c from bar where bat = :baz 

यह काम करता है, 99% ठीक: नामांकित पैरामीटर, जो मेरे लिए समय की सबसे काम करते हैं, कोलन के साथ पेश कर रहे हैं। हर अब और फिर मुझे लगता है कि एडीओ या इसके आसपास डेल्फी के रैपर, स्वीकार नहीं करेंगे ": baz" और आवश्यकता है कि मैं इस के बजाय लिखें:

select f, g, h from bar where bat = ? 

यह एक नामित पैरामीटर के बजाय एक अनाम पैरामीटर में परिणाम है,। जब एक एडीओ क्वेरी या एडीओ कमांड में केवल एक पैरामीटर होता है, तो यह एक बड़ा सौदा नहीं है। लेकिन ऐसा नहीं है जब एडीओ मुझ पर काम करता है। कल यह एक तरह से, और आज, एक भी TADOCommand वस्तु में एक दोहरे आदेश, इस तरह से एक अलग तरह से काम किया, एक CommandText स्ट्रिंग में दो आदेशों के साथ:

delete from bar where id = :id1 
delete from bat where id = :id2 

मैं इस के लिए बदलना पड़ा:

delete from bar where id = ? 
delete from bat where id = ? 

यह कल पूरे दिन काम करता था। आज, मुझे इसे काम करने के लिए इसे पहले संस्करण में बदलना पड़ा। लक्षण यह था कि एडीओ पैरामीटर गायब हो गए और वापस नहीं आएंगे, और जब मैं कमांड निष्पादित करने का प्रयास करता हूं तो मुझे Parameters[0] तक पहुंचने का प्रयास करते समय त्रुटि से बाहर सूचकांक मिलता है। कुछ भी मुझे कोई चेतावनी नहीं देता है कि पैरामीटर दूर जा रहे हैं। ऐसा लगता है कि एडीओ डेटासेट के लिए कुछ कनेक्शन, डिज़ाइनटाइम पर, TADOCommand घटक विशेष रूप से जॉग करते हैं, और यह "बस मुझ पर टूट जाता है"। जब आप कोई प्रश्न या कमांड लिखने की कोशिश कर रहे हैं तो यह विशेष रूप से गड़बड़ कर रहा है, और आप जानते हैं कि यह काम करता है, लेकिन एडीओ घटक ने "स्वीकार नहीं किया" या ": एक्स" अभी अभी। आप एक से दूसरी तरफ स्विच करके काम करने की कुल असमर्थता प्राप्त कर सकते हैं। लेकिन यह मुझे निराश करता है, और शायद वास्तव में अन्य लोगों को पूरी तरह से अवरुद्ध करता है। मुझे पता है कि कुछ लोग हमेशा गतिशील रूप से कोड में अपने एसक्यूएल का निर्माण करते हैं, और Parameters का उपयोग करने से बचते हैं, और शायद यही कारण है कि

मेरे सवाल का संभावित उत्तर है कि मैं कर रहा हूँ की आशंका कर रहे हैं:

  1. एडीओ कई आदेशों का समर्थन नहीं करता, या कम से कम डेल्फी के रैपर नहीं है। या शायद TADOCommand बस विश्वसनीय रूप से यहां काम नहीं करता है।

  2. पैरामीटर सभी एडीओ, या डेल्फी के एडीओ रैपर में एक छोटी गाड़ी क्षेत्र हैं?

  3. आप इसे गलत कर रहे हैं।

मैं डेल्फी एक्सई 2 का उपयोग कर रहा हूं, लेकिन मैंने 2007, 200 9, 2010 और एक्सई में इसी तरह के डोडी व्यवहार को देखा है। मैं अपने ओएलडीडीबी प्रदाता के रूप में SQL सर्वर के लिए माइक्रोसॉफ्ट ओएलडीडीबी प्रदाता का उपयोग कर रहा हूं।

+0

यदि आप दोनों आदेशों को एक सेमी-कोलन के साथ (SQL सर्वर के लिए) अलग करते हैं तो क्या इससे कोई फर्क पड़ता है? –

+0

उन परियोजनाओं में जिन्हें डेटा-जागरूक नियंत्रण की आवश्यकता नहीं है, मैंने कुछ बार एडीओडीबी और एडीओआईएनटी का उपयोग करने के लिए स्विच किया है। यहां की तरह: http://xxm.svn.sourceforge.net/viewvc/xxm/trunk/Delphi/demo2/03%20Data/xxmData.pas?view=markup मैंने यह जांच नहीं की है कि यह प्रदर्शन के लिए क्या करता है, लेकिन वास्तव में इन दिनों में से किसी एक को जांचें (और मेरे परिणाम यहां उत्तर के रूप में पोस्ट करें) ... –

+0

मूक: मैं अर्धविराम का प्रयास करूंगा। मेरी यादें यह है कि डेल्फी एडीओ घटक अलग-अलग सेपरेटर का समर्थन नहीं करते हैं। –

उत्तर

0

हां कुछ ऐसे मामले हैं जहां ? के साथ पैरामीटर विफल हो जाते हैं। मुझे कभी-कभी मुझे :named पैरामीटर का उपयोग करने की आवश्यकता है। नामित पैरामीटर को डीबी पैरामीटर मानों के साथ काम करने का लाभ होता है, क्योंकि नाम प्रॉपर्टी सेट एडीओ क्वेरी या डेटासेट या टेबल को डिबग करने में भी आसान बनाता है।

मुझे समझ में नहीं आता क्यों। यदि आपको यह समस्या है, तो पहले जांचें कि आप सही OLEDB प्रदाता का उपयोग कर रहे हैं, और जांचें कि कौन सा संस्करण है। आपके द्वारा जेनरेट किए गए खराब एसक्यूएल के कारण संभावित पार्सिंग त्रुटियों की भी जांच करें।

मुझे संदेह है कि कोड में OLEDB प्रदाता के अंदर एक आंतरिक व्यवहार है जिसके पास मेरे पास स्रोत कोड नहीं है, इस क्विर्क के लिए दोष देना है। डेल्फी एडीओ क्लास रैपर डेल्फी के डेटाबेस घटक परत आर्किटेक्चर से एडीओ की कोर क्वेरी/टेबल/डेटासेट एपीआई में अनुवादक हैं, जिनमें से सभी COM वस्तुओं के एक सेट के आसपास हुड रैपर के नीचे हैं जो ADO RecordSets से निपटते हैं।

0

दुर्भाग्य से, मैंने थोड़ी देर में डेल्फी का उपयोग नहीं किया है, इसलिए, और मेरे पास डेल्फी परिप्रेक्ष्य से इस उत्तर को सत्यापित करने का साधन नहीं है।

यह पहली बार है जब मैंने एक कोलन (:) के साथ उपसर्ग वाले पैरामीटर नामित किए हैं।आमतौर पर, एडीओडीबी में, नामित पैरामीटर एक (@) पर प्रीफ़िक्स्ड होते हैं और, हां, अज्ञात पैरामीटर एक प्रश्न चिह्न (?) के साथ दिए जाते हैं। नामित मापदंडों के

एक महत्वपूर्ण लाभ की क्षमता पुन: उपयोग किया जा करने के लिए है, यानी

INSERT INTO TABLE T VALUES (@id, @id, 'Hello World'); 

ADODB स्तर पर है। एक बार जब आप पैरामीटर का इस्तेमाल करते हैं, या तो नामित, या अनामित, आप पैरामीटर बनाने के तेज़ साधन के रूप में CommandText.Parameters.Refresh का उपयोग कर सकते हैं।

+1

"आमतौर पर, एडीओडीबी में, नामित पैरामीटर एक (@)" के साथ प्रीफ़िक्स्ड होते हैं - एडीओडीबी में संग्रहित प्रक्रियाओं के पैरामीटर को छोड़कर पैरामीटर नाम नहीं दिए जाते हैं, जब तक कि आपके पास कोई विशेष प्रदाता न हो जो उनके लिए समर्थन जोड़ता हो। आमतौर पर इस्तेमाल किए गए SQLOLEDB प्रदाता में कम से कम नहीं होता है। ADO.NET में, नामित पैरामीटर संभव हैं, @ उपसर्ग का उल्लेख करते हुए, लेकिन ADO.NET को डेल्फी से आसानी से उपयोग नहीं किया जा सकता है। – hvd

1

: के साथ नामित पैरामीटर? मैंने हमेशा इसे विजुअल स्टूडियो (ADO.NET) पर @ के साथ उपयोग किया। और टी-एसक्यूएल पैरामीटर और चर में @ के साथ उपसर्ग किया गया है।

एसक्यूएल सर्वर के लिए OLEDB प्रदाता के बजाय उस के साथ परेशानी हो रही याद नहीं है ... क्या आप वाकई मूल क्लाइंट (एक एसक्यूएल सर्वर क्लाइंट के साथ स्थापित स्थापित) का चयन नहीं करता है (जो विंडोज के साथ आता)?

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