2008-12-05 10 views
6

मैं डेल्फी प्रोग्रामर नहीं हूं, लेकिन मुझे एक पुराना डेल्फी 7 एप्लिकेशन मिला है जिसे मुझे ठीक करने की आवश्यकता है और यह एडीओ का उपयोग कर रहा है।डेल्फी एडीओ को पूरी तालिका को स्मृति में लोड करने से कैसे रोकें?

डेटाबेस तालिका (एमएस एक्सेस) में +100,000 पंक्तियां होती हैं और जब मैं ADOTable.Active = true सेट करता हूं तो यह पूरी तालिका को रैम में लोड करना शुरू कर देता है और इसमें बहुत सारी स्मृति और समय लगता है।

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

मूल रूप से सब हम करते हैं att कार्यक्रम स्टार्टअप है:

// Connect to database 
DataModule.MyADOConnection.Connected:=true; 

DataModule.MeasurementsADOTable.MaxRecords:=1; 

// Open datatables 
DataModule.MeasurementsADOTable.Active:=true;     

की स्थापना सक्रिय करने के बाद = सच यह रैम में पूरे माप लोड करने के लिए शुरू होता है और समय लगता है!

हम MSDASQL.1 प्रदाता का उपयोग कर रहे हैं। शायद यह MaxRecords संपत्ति का समर्थन नहीं करता है?

मैं इस डेटा ऑब्जेक्ट में केवल "माप से शीर्ष 1 * लोड" करने के लिए कुछ सीमित क्वेरी कैसे जोड़ूं?

उत्तर

10

आप एसक्यूएल क्वेरी के साथ परिणाम सेट को सीमित करने के लिए TADOQuery का उपयोग कर सकते हैं। या आप TADOTable का उपयोग कर सकते हैं और क्लाइंट को पूर्ण परिणामसेट को स्मृति में लोड करने से रोकने के लिए CursorLocation को सर्वर साइड कर्सर पर सेट कर सकते हैं।

0
  1. अपने datamodule जहां "MeasurementsADOTable" वर्तमान में रहता है, एक TADOQuery और यह नाम "MeasurementsADOQuery"
  2. कनेक्शन (MyADOConnection को MeasurementsADOQuery की संपत्ति मानते हुए इस मामले प्रदान की छोटी सी कोड स्निपेट के आधार पर है सेट छोड़ देते हैं।)
  3. मैं भी यह सोचते हैं रहा हूँ कि तुम एक ग्रिड प्रदर्शित कर रहे हैं या नहीं तो एक डेटास्रोत का उपयोग कर -
  4. संपादित MeasurementsADOQuery को वास्तविक क्वेरी MeasurementsADOTable से डेटा स्रोत घटक की 'डेटासेट "संपत्ति को बदलने MeasurementsADOQuery की एसक्यूएल संपत्ति की स्थापना द्वारा निष्पादित किया जाना है । (इससे पहले कि उद्घाटन क्रम में: Measurements.SQL.Text: = 'का चयन करें जो कुछ भी प्रमुख 10 * माप से आदेश')
  5. का विश्लेषण करें/MeasurementsADOTable से कोड में सभी संदर्भों को बदलने MeasurementsADOQuery को
5

आप इस्तेमाल कर सकते हैं कि adoTable एक सर्वर ओपनफॉरवर्ड के साथ केवल कर्सर और पैकेट रीकॉर्डर्स के साथ एक TCLientDataset nonzero मान पर सेट है। काम किया आश्चर्यजनक रूप से जब मुझे एमएसएसएलएल से ओरेकल से डेटा पंप करने के लिए एक ऐप लिखना पड़ा, जिसमें लाखों रिकॉर्ड के साथ टेबल के साथ अनुकूलित तरीके से अनुकूलित किया गया। -

संपादित करें> यह इस की तर्ज पर कुछ होगा:

procedure ConfigCDSFromAdoQuery(p_ADOQ: TADOQuery; p_CDS: TClientDataset; p_Prov: TDatasetProvider); 
begin 
    If p_ADOQ.Active then p_ADOQ.Close; 
    p_ADOQ.CursorLocation := clServer; 
    p_ADOQ.CursorType := ctOpenForwardOnly; 
    p_Prov.Dataset := p_ADOQ; 
    p_CDS.SetProvider(p_Prov); 
    p_CDS.PacketRecords := 100; 
    p_CDS.Open; 
end ; 

मैं सभी कोड के द्वारा इस किया है, लेकिन इस बात का सबसे आप डिजाइन समय में कर सकते हैं।

+0

कैसे मैं अपने MSACCESS साथ TCLientDataset कनेक्ट करते हैं? क्या आपके पास कुछ नमूना कोड है जिसे आप साझा कर सकते हैं? – Vlad

+1

@Vlad: प्रक्रिया हमेशा एक ही होती है: TDatasetProvider (डीएसपी) के साथ TClientDataset (सीडीएस) को कनेक्ट करें, उस बिंदु के बाद संपत्ति DSP.DataSet गुण ADOQuery पर आप डेटा ला रहे हैं। डेल्फी सेक्शन में आप हजारों उदाहरण और एम्बरकेडेरो डॉकविकी में भी पा सकते हैं। –

+0

धन्यवाद, मैं एक नमूना प्रोजेक्ट बनाने की कोशिश करूंगा, लेकिन फिर भी "सर्वर (कर्सर स्थान?) ओपनफॉरवर्ड के साथ एक डेमो केवल कर्सर और पैकेट रीकॉर्डर्स के साथ एक टीसीएलआईन्ट डेटासेट गैर-मूल्य मान पर सेट होगा" बहुत अच्छा होगा! ;) – Vlad

-1

मुझे एडीओ + एक्सेस डब्ल्यू/डेल्फी दर्दनाक धीमा होने के लिए मिला है, बहुत सी चीजों के लिए (बड़ी तालिका पढ़ती है जैसे आप वर्णन कर रहे हैं, लेकिन साथ ही इन्सर्ट भी इत्यादि)। मेरा जवाब "एडीओ और एक्सेस पूरी तरह से उपयोग छोड़ो" बन गया।

कभी समझ में नहीं आया कि यह इतना खराब क्यों किया गया, खासकर जब पिछली प्रौद्योगिकियां नहीं लगतीं।

1

यह आलेख बीडीई विशिष्ट है, लेकिन एडीओ या अधिकतर क्लाइंट डेटा एक्सेस पुस्तकालयों पर लागू होता है।

http://dn.codegear.com/article/28160

मैं TADODataSet का उपयोग कर की सिफारिश करेंगे (यह "करीब" TADOQuery से एडीओ परत के लिए) और केवल डेटा ग्राहक एक कस्टम खोज प्रपत्र (दिनांक सीमा, विशेष आइटम की सूची, आदि उपलब्ध कराने के द्वारा की जरूरत का चयन)

गुड लक

0

न स्टार्टअप पर और बाद में एक ही रास्ता है, लेकिन अभी भी नहीं मदद वास्तव में करने वाला है यह सच मोड़ adotable सक्रिय बनाने के .... एक adodataset का उपयोग करें और पॉप्युलेट कि नहीं बल्कि के रूप में अपने कनेक्शन के साथ रनटाइम के दौरान की जरूरत पाठ। केवल प्रासंगिक डेटा को बहुत तेज़ी से प्राप्त किया जाएगा।

0

उपयोग adoquery आप किसी भी पंक्ति की जरूरत नहीं है और सिर्फ इस की तरह नई पंक्ति उपयोग एसक्यूएल कमांड डालने चाहते हैं 'का चयन करें * MyTable से जहाँ आईडी = -1' के बाद से आईडी है autonumber कोई भी पंक्ति वापस आ जाएगी। या 'myTable से चुनें * जहां 1 = -1' लेकिन मुझे लगता है कि यह डेटा डालने के लिए एक अच्छा तरीका नहीं है। Adocommand का उपयोग करना बहुत बेहतर है।

यदि आप X पंक्तियों चाहते 'से शीर्ष एक्स * चयन mytable'

+0

स्मृति में लोड पूरी तालिका को रोकने के साथ सुनिश्चित करें !!! adotable के बजाय adoquery का उपयोग करके, एक झूठी स्थिति की स्थिति को सफ़ेद करें <एक भी पंक्ति को लोड करने से रोक देगा। अगर कोई चुनिंदा शीर्ष एक्स का उपयोग कर कुछ डेटा चाहता है तो यह करेगा। लेकिन आप सही हैं कि मुझे यह समझाने के लिए पोस्ट संपादित करना होगा कि मेरा क्या मतलब बेहतर था –

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