अद्यतन करें: SQLExecute
. के अर्थ के बारे में कुछ और स्पष्टीकरण जोड़े गए हैं और एक्सेस कैसे तैयार प्रश्नों को संभाल रहा है। धन्यवाद, बॉब!
जब हम ओडीबीसी लिंक की गई तालिका में रिकॉर्ड ब्राउज़ करते हैं और देखते हैं तो एक्सेस क्या कर रहा है?
हमारी ओडीबीसी ट्रेसिंग श्रृंखला के दूसरे भाग में, हमारा ध्यान ओडीबीसी लिंक्ड टेबल के भीतर रिकॉर्डसेट प्रकारों के प्रभाव पर होगा। पिछले लेख में हमने सीखा कि ODBC SQL ट्रेस कैसे चालू करें और अब हम आउटपुट देख सकते हैं। यदि आपने इसके साथ थोड़ा खेला है, तो आपने देखा होगा कि आपकी एक्सेस क्वेरी और ओडीबीसी एसक्यूएल स्टेटमेंट एक्सेस जेनरेट बहुत समान नहीं दिखते हैं। हम इस बात पर भी गहराई से नज़र डालेंगे कि किस प्रकार से सेलेक्ट क्वेरी के व्यवहार को प्रभावित करता है, और हम स्नैपशॉट और डायनासेट जैसे रिकॉर्डसेट के विभिन्न रूपों पर भी गौर करेंगे।
यदि आप साथ चलना चाहते हैं, तो आप यहां दिए गए नमूना डेटाबेस का उपयोग कर सकते हैं।
चयन क्वेरी में रिकॉर्डसेट प्रकारों का प्रभाव
ओडीबीसी डेटा स्रोतों के साथ एक्सेस कैसे संचार करेगा, इस पर रिकॉर्डसेट प्रकारों का बड़ा प्रभाव पड़ता है। आपने देखा होगा कि प्रपत्र डिज़ाइन दृश्य में या क्वेरी डिज़ाइन दृश्य में, आप रिकॉर्डसेट प्रकार सेट कर सकते हैं। डिफ़ॉल्ट रूप से, यह Dynaset
. पर सेट होता है ।
VBA में, हमारे पास कुछ और विकल्प हैं लेकिन हम अभी इसके बारे में चिंता नहीं करेंगे। आइए यह समझने के साथ शुरू करें कि वास्तव में Dynaset
क्या है? और Snapshot
मतलब पहले। हम कम इस्तेमाल होने वाले टाइप Snapshot
. से शुरुआत करेंगे पहले।
स्नैपशॉट प्रकार के रिकॉर्डसेट
Snapshot
काफी सरल है। इसका मूल रूप से मतलब है कि हम क्वेरी के निष्पादन के समय परिणाम का एक स्नैपशॉट लेते हैं। आम तौर पर, इसका मतलब यह भी है कि एक्सेस परिणाम को अपडेट नहीं कर सकता है। हालांकि, आइए देखें कि एक्सेस स्नैपशॉट-आधारित रिकॉर्डसेट के साथ स्रोत से कैसे पूछताछ करता है। हम इस तरह एक नई एक्सेस क्वेरी बना सकते हैं:
एसक्यूएल जैसा कि हम एक्सेस क्वेरी के एसक्यूएल व्यू में देख सकते हैं:
SELECT Cities.* FROM Cities;हम क्वेरी चलाएंगे और फिर
sqlout.txt
. को देखेंगे फ़ाइल। यहाँ आउटपुट, पठनीयता के लिए स्वरूपित है: SQLExecDirect: SELECT "CityID" ,"CityName" ,"StateProvinceID" ,"Location" ,"LatestRecordedPopulation" ,"LastEditedBy" ,"ValidFrom" ,"ValidTo" FROM "Application"."Cities"ओडीबीसी को भेजे गए एक्सेस की तुलना में एक्सेस की क्वेरी में हमने जो लिखा, उसमें कुछ अंतर थे, जिसका हम विश्लेषण करेंगे।
- स्कीमा नाम के साथ योग्य तालिका तक पहुंचें। जाहिर है, एक्सेस एसक्यूएल बोली में, यह उसी तरह काम नहीं करता है लेकिन ओडीबीसी एसक्यूएल बोली के लिए, यह सुनिश्चित करने में मददगार है कि हम सही तालिका से चयन कर रहे हैं। यह
SourceTableName
. द्वारा नियंत्रित होता है संपत्ति। - एक्सेस ने
Cities.*
Fields
. के आधार पर एक्सेस के बारे में पहले से ही ज्ञात सभी स्तंभों की एक गणना सूची में अंतर्निहितTableDef
. का संग्रह वस्तु। - उपयोग किए गए
"
. तक पहुंच पहचानकर्ताओं को उद्धृत करने के लिए, जो ओडीबीसी एसक्यूएल बोली की अपेक्षा करता है। भले ही Access SQL और Transact-SQL दोनों किसी पहचानकर्ता को उद्धृत करने के लिए कोष्ठक का उपयोग करते हैं, लेकिन यह ODBC SQL बोली में एक कानूनी सिंटैक्स नहीं है।
इसलिए भले ही हमने केवल एक टेबल के लिए सभी कॉलम का चयन करते हुए एक साधारण स्नैपशॉट क्वेरी की थी, आप देख सकते हैं कि एक्सेस क्वेरी डिज़ाइन व्यू या एसक्यूएल व्यू में जो कुछ भी डालता है, उसके बीच एक्सेस एसक्यूएल में बहुत अधिक परिवर्तन करता है, जो एक्सेस वास्तव में डेटा को उत्सर्जित करता है। स्रोत। इस मामले में, हालांकि, यह ज्यादातर वाक्य-विन्यास है इसलिए मूल एक्सेस क्वेरी और ODBC SQL कथन के बीच SQL कथन में कोई वास्तविक अंतर नहीं है।
ट्रेस भी जोड़ा गया SQLExecDirect
SQL कथन की शुरुआत में। कुछ अन्य उदाहरण देखने के बाद हम उस पर वापस जाएंगे।
डायनासेट प्रकार के रिकॉर्डसेट
हम उसी क्वेरी का उपयोग करेंगे, लेकिन प्रॉपर्टी को उसके डिफ़ॉल्ट Dynaset
. में बदल देंगे .
इसे फिर से चलाएं, और हम देखेंगे कि हमें sqlout.txt
से क्या मिलता है। . फिर से, इसे पठनीयता के लिए स्वरूपित किया गया है:
SQLExecDirect: SELECT "Application"."Cities"."CityID" FROM "Application"."Cities" SQLPrepare: SELECT "CityID" ,"CityName" ,"StateProvinceID" ,"Location" ,"LatestRecordedPopulation" ,"LastEditedBy" ,"ValidFrom" ,"ValidTo" FROM "Application"."Cities" WHERE "CityID" = ? SQLExecute: (GOTO BOOKMARK) SQLPrepare: SELECT "CityID" ,"CityName" ,"StateProvinceID" ,"Location" ,"LatestRecordedPopulation" ,"LastEditedBy" ,"ValidFrom" ,"ValidTo" FROM "Application"."Cities" WHERE "CityID" = ? OR "CityID" = ? OR "CityID" = ? OR "CityID" = ? OR "CityID" = ? OR "CityID" = ? OR "CityID" = ? OR "CityID" = ? OR "CityID" = ? OR "CityID" = ? SQLExecute: (MULTI-ROW FETCH) SQLExecute: (MULTI-ROW FETCH)वाह, बहुत कुछ हो रहा है! स्नैपशॉट-प्रकार के रिकॉर्डसेट की तुलना में यह निश्चित रूप से अधिक बातूनी है। आइए एक-एक करके उन पर चलते हैं।
पहला वाला केवल CityID
. का चयन करता है कॉलम। यह तालिका की प्राथमिक कुंजी होती है, लेकिन इससे भी महत्वपूर्ण बात यह है कि यह वह सूचकांक है जिसे एक्सेस अपने पक्ष में उपयोग कर रहा है। यह तब महत्वपूर्ण हो जाएगा जब हम बाद में विचारों का अध्ययन करेंगे। एक्सेस इस क्वेरी का उपयोग कुंजी प्राप्त करने के लिए करता है और बाद में अन्य प्रश्नों को भरने के लिए इसका उपयोग करता है जैसा कि हम देखेंगे।
दूसरा कथन मूल स्नैपशॉट क्वेरी के अधिक करीब है, सिवाय इसके कि अब हमारे पास एक नया WHERE
है CityID
. पर क्लॉज फ़िल्टरिंग कॉलम। इससे हम देख सकते हैं कि यह सिंगल-रो फ़ेच है। हम पहली क्वेरी से प्राप्त कुंजियों का उपयोग कर सकते हैं और इस क्वेरी में शेष कॉलम एकत्र कर सकते हैं। जब भी वह तैयार स्टेटमेंट निष्पादित होता है, तो आपको एक SQLExecute: (GOTO BOOKMARK)
दिखाई देगा। ।
लेकिन यह अक्षम होगा यदि हमें सभी पंक्तियों के लिए ऐसा करना पड़े ... और यहीं पर अगली क्वेरी आती है। तीसरा कथन 2 के समान है लेकिन इसमें 10 विधेय हैं। यह तैयार क्वेरी प्रत्येक SQLExecute: (MULTI_ROW FETCH)
के साथ निष्पादित होती है . तो इसका मतलब यह है कि जब हम एक फॉर्म या डेटाशीट लोड करते हैं या यहां तक कि वीबीए कोड में एक रिकॉर्डसेट खोलते हैं, तो एक्सेस सिंगल-पंक्ति संस्करण या एकाधिक-पंक्ति संस्करण का उपयोग करेगा और पहले से प्राप्त कीज़ का उपयोग करके पैरामीटर भर देगा। क्वेरी।
बैकग्राउंड लाना और फिर से सिंक्रोनाइज़ करना
संयोग से, क्या आपने कभी गौर किया है कि जब आप कोई फॉर्म या डेटाशीट खोलते हैं, तो आपको नेविगेशन बार में "Y का X" नहीं दिखाई देता है?
ऐसा इसलिए है क्योंकि एक्सेस यह नहीं जान सकता कि पहली क्वेरी से परिणाम एकत्रित करने तक कितने हैं। यही कारण है कि आप अक्सर पा सकते हैं कि बड़ी मात्रा में डेटा लौटाने वाली क्वेरी को खोलना बहुत तेज़ है। आप पूरे रिकॉर्डसेट की केवल एक छोटी सी विंडो का पूर्वावलोकन कर रहे हैं, जबकि एक्सेस पृष्ठभूमि में पंक्तियों को ला रहा है। यदि आप "गो टू लास्ट" बटन पर क्लिक करते हैं, तो आप पा सकते हैं कि यह एक्सेस को फ्रीज कर देता है। नेविगेशन बार में "Y का X" देखने से पहले आपको पहली क्वेरी में सभी कुंजियों को प्राप्त करने तक प्रतीक्षा करनी होगी।
इस प्रकार, आप इस बात की सराहना कर सकते हैं कि जब हम उपयोग करते हैं तो एक्सेस कैसे एक बड़े रिकॉर्डसेट को खोलने के लिए त्वरित होने का भ्रम प्रदान कर सकता है एक डायनासेट प्रकार का रिकॉर्डसेट और यह आमतौर पर उपयोगकर्ता के लिए एक अच्छा अनुभव होता है।
अंत में, हमें यह नोट करने की आवश्यकता है कि हमें 3 अलग-अलग प्रकार के निष्पादन मिले, SQLExecDirect
, SQLPrepare
और SQLExecute
. आप देख सकते हैं कि पूर्व के साथ, हमारे पास कोई पैरामीटर नहीं है। क्वेरी बस-जैसी है। हालाँकि, यदि किसी क्वेरी को पैरामीटराइज़ करने की आवश्यकता है, तो उसे पहले SQLPrepare
के माध्यम से तैयार करना होगा और फिर बाद में SQLExecute
. के साथ क्रियान्वित किया गया प्रदान किए गए मापदंडों के लिए मूल्यों के साथ। हम यह नहीं देख सकते हैं कि SQLExecute
में वास्तव में कौन से मान पास किए गए थे कथन हालांकि हम एक्सेस में जो देखते हैं उससे हम अनुमान लगा सकते हैं। आप केवल यह जान सकते हैं कि क्या इसने एक पंक्ति प्राप्त की है (SQLExecute: (GOTO BOOKMARK)
का उपयोग करके) या एकाधिक पंक्तियां (SQLExecute: (MULTI-ROW FETCH)
) एक्सेस एकाधिक-पंक्ति संस्करण का उपयोग पृष्ठभूमि लाने और रिकॉर्डसेट को क्रमिक रूप से भरने के लिए करेगा लेकिन केवल एक पंक्ति को भरने के लिए एकल-पंक्ति संस्करण का उपयोग करेगा। निरंतर फॉर्म या डेटाशीट व्यू के विपरीत एकल फॉर्म व्यू पर ऐसा हो सकता है या अपडेट के बाद इसे फिर से सिंक्रोनाइज़ करने के लिए इस्तेमाल किया जा सकता है।
आसपास नेविगेट करना
पर्याप्त बड़े रिकॉर्डसेट के साथ, एक्सेस कभी भी सभी रिकॉर्ड प्राप्त करने में सक्षम नहीं हो सकता है। जैसा कि पहले उल्लेख किया गया है, उपयोगकर्ता को जितनी जल्दी हो सके डेटा के साथ प्रस्तुत किया जाता है। आम तौर पर, जब उपयोगकर्ता रिकॉर्डसेट के माध्यम से आगे बढ़ता है, तो एक्सेस बफर को उपयोगकर्ता से आगे रखने के लिए अधिक से अधिक रिकॉर्ड प्राप्त करता रहेगा।
लेकिन मान लीजिए कि उपयोगकर्ता नेविगेशन नियंत्रण में जाकर 100वीं पंक्ति में कूदता है और वहां 100 दर्ज करता है?
उस स्थिति में, एक्सेस निम्नलिखित प्रश्न सबमिट करेगा...
SQLExecute: (MULTI-ROW FETCH) SQLExecute: (GOTO BOOKMARK) SQLExecute: (MULTI-ROW FETCH) SQLExecute: (MULTI-ROW FETCH)ध्यान दें कि एक्सेस रिकॉर्डसेट खोलते समय पहले से तैयार किए गए बयानों का उपयोग कैसे करता है। क्योंकि इसमें पहले से ही पहली क्वेरी की कुंजियाँ हैं, यह जानने में सक्षम है कि "100 वीं" पंक्ति कौन सी है। अधिक ठोस उदाहरण का उपयोग करने के लिए। मान लीजिए कि हमारे पास
CityID
था 1, 3, 4, 5…99, 100, 101, 102 से शुरू होकर CityID = 2
के लिए कोई रिकॉर्ड नहीं है . पहली क्वेरी में, CityID
101 100वीं पंक्ति में होगा। इसलिए, जब उपयोगकर्ता 100 तक कूदता है, तो एक्सेस पहली क्वेरी में 100वीं पंक्ति को देखता है, देखें कि यह CityID
है 101, फिर वह मान लेता है और उसे SQLExecute: (GOTO BOOKMARK)
में फीड करता है उस रिकॉर्ड पर तुरंत नेविगेट करने के लिए। इसके बाद यह अगले 10 रिकॉर्ड को देखता है और उन बाद के CityID
. का उपयोग करता है बफर को कई SQLExecute: (MULTI-ROW FETCH)
से भरने के लिए . आपने देखा होगा कि एकल पंक्ति लाने से पहले कई पंक्तियाँ फ़ेच होती हैं। एक्सेस वास्तव में 101वीं-110वीं पंक्तियों को कई पंक्तियों में ला रहा है और अगली एकल पंक्ति में 100वां रिकॉर्ड प्राप्त करता है। एक बार एक्सेस को 100 वीं पंक्तियों के लिए डेटा मिल गया है, यह उपयोगकर्ता को वहां ले जाता है, फिर उस 100 वीं पंक्ति के आसपास बफर भरना शुरू कर देता है। यह उपयोगकर्ता को सभी 11वें-99वें रिकॉर्ड को लोड करने के लिए प्रतीक्षा किए बिना 100वीं पंक्ति देखने में सक्षम बनाता है। उपयोगकर्ता के पास स्पष्ट रूप से त्वरित ब्राउज़िंग अनुभव होता है जब उपयोगकर्ता नई स्थिति से पिछले या अगले क्लिक करता है क्योंकि उपयोगकर्ता द्वारा इसके लिए पूछे जाने से पहले एक्सेस ने इसे पृष्ठभूमि में लोड कर दिया है। यह धीमे नेटवर्क पर भी तेज़ होने का भ्रम पैदा करने में मदद करता है।
लेकिन भले ही उपयोगकर्ता ने फॉर्म को खुला और निष्क्रिय छोड़ दिया हो, एक्सेस पृष्ठभूमि लाने और बफर को रीफ्रेश करने दोनों को जारी रखेगा ताकि उपयोगकर्ता पुराना डेटा दिखाने से बच सके। यह क्लाइंट सेटिंग टैब में उन्नत अनुभाग के अंतर्गत, विकल्प संवाद में ODBC सेटिंग्स द्वारा नियंत्रित होता है:
ओडीबीसी रीफ्रेश अंतराल के लिए डिफ़ॉल्ट 1500 सेकेंड है लेकिन इसे बदला जा सकता है। इसे वीबीए के माध्यम से भी बदला जा सकता है।
निष्कर्ष:चंकी या चट्टी
अब आपको यह देखना चाहिए कि डायनासेट-प्रकार के रिकॉर्डसेट अपडेट करने योग्य क्यों हैं, लेकिन स्नैपशॉट-प्रकार के रिकॉर्डसेट नहीं हैं, क्योंकि एक्सेस सर्वर से उसी के नवीनतम संस्करण के साथ रिकॉर्डसेट में एक पंक्ति को प्रतिस्थापित करने में सक्षम है क्योंकि यह जानता है कि कैसे चयन करना है एक पंक्ति। इस कारण से, एक्सेस को 2 ओडीबीसी प्रश्नों को प्रबंधित करने की आवश्यकता है; एक कुंजी लाने के लिए और दूसरा किसी दिए गए कुंजी के लिए पंक्तियों की वास्तविक सामग्री लाने के लिए। वह जानकारी स्नैपशॉट प्रकार के रिकॉर्डसेट के साथ मौजूद नहीं थी। हमें अभी-अभी डेटा का एक बड़ा ब्लॉब मिला है।
हमने 2 प्रमुख प्रकार के रिकॉर्डसेट देखे, हालांकि और भी हैं। हालाँकि, अन्य हमारे द्वारा कवर किए गए 2 प्रकारों के केवल वेरिएंट हैं। लेकिन अभी के लिए, यह याद रखना पर्याप्त है कि स्नैपशॉट का उपयोग करना हमारे नेटवर्क संचार में चंकी होना है। दूसरी ओर, डायनासेट का उपयोग करने का मतलब है कि हम बातूनी होंगे। दोनों के अपने उतार-चढ़ाव हैं।
उदाहरण के लिए, स्नैपशॉट रिकॉर्डसेट को डेटा पुनर्प्राप्त करने के बाद सर्वर के साथ और संचार की आवश्यकता नहीं होती है। जब तक रिकॉर्डसेट खुला रहता है, एक्सेस अपने स्थानीय कैश के आसपास स्वतंत्र रूप से नेविगेट कर सकता है। एक्सेस के लिए भी कोई लॉक रखने की आवश्यकता नहीं होती है और इस प्रकार अन्य उपयोगकर्ताओं को ब्लॉक कर दिया जाता है। हालाँकि, स्नैपशॉट रिकॉर्डसेट को खोलने के लिए आवश्यक रूप से धीमा है क्योंकि इसे सभी डेटा को अग्रिम रूप से एकत्र करना है। यह एक बड़े रिकॉर्डसेट के लिए खराब फिट हो सकता है, भले ही आप सभी डेटा को पढ़ने का इरादा रखते हों।
मान लीजिए कि आप एक बड़ी एक्सेस रिपोर्ट बना रहे हैं जो 100 पृष्ठों की है, यह आमतौर पर डायनासेट-प्रकार के रिकॉर्डसेट का उपयोग करने योग्य है। जैसे ही यह पहले पृष्ठ को प्रस्तुत करने के लिए पर्याप्त है, यह पूर्वावलोकन प्रस्तुत करना शुरू कर सकता है। यह आपको तब तक प्रतीक्षा करने के लिए मजबूर करने से बेहतर है जब तक कि यह पूर्वावलोकन को प्रस्तुत करना शुरू करने से पहले सभी डेटा को पुनः प्राप्त नहीं कर लेता। हालांकि एक डायनासेट रिकॉर्डसेट ताले ले सकता है, यह आमतौर पर थोड़े समय के लिए होता है। एक्सेस के लिए अपने स्थानीय कैश को फिर से सिंक्रनाइज़ करने के लिए यह केवल काफी लंबा है।
लेकिन जब हम सोचते हैं कि डायनासेट-प्रकार के रिकॉर्डसेट के साथ नेटवर्क पर एक्सेस कितने और अनुरोध सबमिट करता है, तो यह देखना आसान है कि यदि नेटवर्क विलंबता खराब है, तो एक्सेस का प्रदर्शन तदनुसार प्रभावित होगा। एक्सेस के लिए उपयोगकर्ताओं को सामान्य तरीके से डेटा स्रोतों को संपादित और अपडेट करने की अनुमति देने के लिए यह आवश्यक है कि एक्सेस एकल पंक्ति को चुनने और संशोधित करने के लिए कुंजियों का ट्रैक रखे। हम इसे आगामी लेखों में देखेंगे। अगले लेख में, हम देखेंगे कि कैसे सॉर्टिंग और समूह एक डायनासेट-प्रकार के रिकॉर्डसेट को प्रभावित करते हैं और साथ ही एक्सेस एक डायनासेट-प्रकार के रिकॉर्डसेट के लिए उपयोग की जाने वाली कुंजी को कैसे निर्धारित करता है।
Microsoft Access में अधिक सहायता के लिए, हमारे विशेषज्ञों को 773-809-5456 पर कॉल करें या हमें [email protected] पर ईमेल करें।