2010-03-08 8 views
15

के साथ एक सरणी को कैसे पॉप्युलेट करना है मैं डेटा को सीधे एक सरणी में डेटा स्थानांतरित करने का प्रयास कर रहा हूं। मैं जानता हूँ कि यह संभव है, लेकिन विशेष रूप से मैं VBA में यह करने के लिए के रूप में इस एमएस एक्सेस में किया जा रहा है 2003रिकॉर्डसेट डेटा

आमतौर पर मैं इस लक्ष्य को हासिल करने के लिए निम्न की तरह कुछ करना होगा चाहते हैं:

Dim vaData As Variant 
    Dim rst As ADODB.Recordset 

    ' Pull data into recordset code here... 

    ' Populate the array with the whole recordset. 
    vaData = rst.GetRows 

क्या मतभेद वीबी और वीबीए के बीच मौजूद है जो इस प्रकार के ऑपरेशन को काम नहीं करता है?

प्रदर्शन चिंताओं के बारे में क्या? क्या यह एक "महंगा" संचालन है?

+0

एक रिकॉर्डसेट एक सरणी है, और एक वीबीए सरणी से अधिक बहुमुखी है (यानी, कॉलम नाम से संदर्भ और न केवल कॉलम इंडेक्स)। क्यों न केवल रिकॉर्डसेट का उपयोग करें? मैं एक दशक से भी अधिक समय तक वीबीए/डीएओ में प्रोग्रामिंग कर रहा हूं और कभी भी गेटरो का उपयोग नहीं किया है। आपको क्या लगता है कि आपको इसकी आवश्यकता है? –

+0

विशेष रूप से समय को कम करने के लिए अन्य ADODB ऑब्जेक्ट्स का कनेक्शन खुला है। –

+2

फिर एडीओ डिस्कनेक्ट किए गए रिकॉर्डसेट के बारे में क्या? –

उत्तर

1

आपका नमूना काम नहीं करेगा सामान्य कारण यह है कि एडीओ के लिए उचित लाइब्रेरी का संदर्भ नहीं दिया गया है (टूल्स-> संदर्भ, माइक्रोसॉफ़्ट एक्टिवैक्स डेटा ऑब्जेक्ट्स x.x लाइब्रेरी), अन्यथा, यह ठीक होना चाहिए।

0

मुझे लगता है कि ऐसा लगता है कि यह एक संदर्भ समस्या हो सकती है।

यदि आप एक्सेस/जेट के साथ चिपकने जा रहे हैं तो आप डीएओ का उपयोग करने पर विचार करना चाहेंगे क्योंकि सभी चीजें बराबर होती हैं तो यह तेजी से एडीओ होगी। के रूप में उल्लेख इस रेफरी समस्या हो सकती है

Dim rst   As ADODB.Recordset 
Dim vDat   As Variant 

Set rst = CurrentProject.Connection.Execute("select * from tblTemp4") 
vDat = rst.GetRows 

एक डिबग-संकलन करते हैं, यहाँ एक त्वरित उदाहरण

Public Sub Foo() 
Dim aFoo As Variant 
Dim db As DAO.Database 
Dim rst As DAO.Recordset 

Set db = DBEngine(0)(0) 
Set rst = db.OpenRecordset("tblFoo") 

With rst 
    .MoveLast 
    .MoveFirst 
    aFoo = .GetRows(.RecordCount) 
End With 

rst.Close 
db.Close 

End Sub 
16

है निम्नलिखित कोड मेरे लिए काम करता है। जैसा कि ध्यान दिया गया है, कुछ डीएओ को देखते हैं, लेकिन ध्यान रखें कि डीएओ आपको एक movelast करने की आवश्यकता है। एडीओ नहीं करता है। इन दिनों, एडीओ या डीएओ वास्तव में आपकी प्राथमिकता के लिए नीचे आता है, और प्रदर्शन शायद ही कभी एक मुद्दा है। एडीओ ऑब्जेक्ट मॉडल का थोड़ा क्लीनर बनता है, लेकिन जो भी आपका परिवार है, वह ज्यादातर मामलों में सबसे अच्छा विकल्प है

+0

डीएओ को एमओएलएलएस्ट की आवश्यकता नहीं है जब तक कि आप एक सटीक रिकॉर्डकाउंट नहीं चाहते हैं, जिसे आपको वास्तव में कभी भी आवश्यकता होती है (आपको केवल यह पता होना चाहिए कि क्या रिकॉर्डर रिकॉर्ड लौटाता है और रिकार्डकाउंट हमेशा 1 या अधिक होता है यदि डीएओ रिकॉर्डसेट रिकॉर्ड लौटाता है)। मुझे एडीओ का उपयोग करने का कोई कारण नहीं दिखता है, जो मर चुका है, मृत, मृत। डीएओ एक लाइव डेटाबेस इंजन का हिस्सा है जो निरंतर विकास में है, और मुझे जेट/एसीई डेटा के साथ काम करने का भविष्य लगता है। –

+1

अब मैं GetRows की जांच करने से देखता हूं कि यदि आप इसे कोई पैरामीटर पास नहीं करते हैं, तो यह केवल एक पंक्ति प्राप्त करता है। आप एक मनमाने ढंग से बड़ी संख्या चुन सकते हैं और छोड़ सकते हैं .MoveLast और प्रदर्शन हिट से बचें। या आप तालिका की जांच करके सटीक रिकॉर्डकाउंट प्राप्त कर सकते हैं।रिकॉर्डकाउंट प्रॉपर्टी, हालांकि यह लिंक्ड टेबल पर काम नहीं करती है, इसलिए आपको सीधे बैक एंड का उपयोग करना होगा (कोड के लिए मुश्किल नहीं है और एक बड़े रिकॉर्डसेट पर मूवलास्ट की तुलना में निश्चित रूप से अधिक कुशल है), लेकिन यह नहीं होगा एकल-टेबल रिकॉर्डसेट के अलावा किसी अन्य चीज़ पर काम करें। –

+1

@ डेविड-डब्ल्यू-फेंटन एडीओ मर नहीं गया है? केटल ने यहां बर्तन को बुलाया ... – Robino

1

एक्सेस में आप एक अनुक्रमित खोज कर सकते हैं। यह बेहद तेज़ तरीका है और सरणी में खोज करने से भी तेज़ है।

Set rs = CreateObject("ADODB.Recordset") 
    rs.CursorLocation = adUseServer 
    rs.Open "MyData", CurrentProject.Connection, , , adCmdTableDirect 
    rs.Index = "fieldX" 

    rs.Seek fieldXvalue 

यदि आप सरणी की तुलना में पूरी तालिका के माध्यम से बस लूप करते हैं तो वास्तव में सबसे तेज़ है। एक अपवाद: सिद्धांत रूप में, यदि आपके पास संख्यात्मक प्राथमिक कुंजी है, तो आप इंडेक्स को सरणी में अपनी सटीक स्थिति में सेट कर सकते हैं, इसलिए कोई भी rs.find या rs.seek बिल्कुल नहीं, आप इसे सरणी (अनुक्रमणिका) जैसे ही एक्सेस कर सकते हैं और यह वास्तव में तेज़ है। मैंने अनुक्रमित खोज के खिलाफ बेंचमार्क नहीं किया, लेकिन यह तेज़ हो सकता है।

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