2012-09-25 14 views
8

एक भी विरासत एमएस एक्सेस आवेदन मैं इस अजीब त्रुटि का सामना करना पड़ा के साथ संघर्ष कर एक ओर जहां:एमएस एक्सेस 2010: "कोई और डेटाबेस नहीं खोल सकता है।"

Cannot open any more databases. 

आवेदन UNION एसक्यूएल बयान की काफी उपयोग किया है। तो ऐसा लगता है कि 2048 ओपन टेबल की सीमा को मारने का उपयोग होता है। इन यूनियनों से छुटकारा पाने से कोई और मौका?

+3

वाह, 2048 तालिकाओं .. दिलचस्पी की वजह से कैसे चीजें इतनी खराब मिला? –

+0

निश्चित रूप से डीबी में कई टेबल नहीं हैं। 50 से कम टेबल हैं, और लगभग 100 प्रश्न हैं। – Christian

+0

कियर के हाइलाइट के बावजूद, मुझे आश्चर्य है कि प्रदान की गई कोई भी उत्तर यूनियन एसक्यूएल के गंभीर पुन: विचार की ओर अधिक नहीं है, अगर डेटा संरचना अच्छी तरह से अनुकूलित की जाती है तो आपको कभी भी इतनी बड़ी क्वेरी के साथ समाप्त होने की आवश्यकता नहीं है। विशेष रूप से पहुंच में बुरा क्योंकि यह सब स्थानीय रूप से चलता है और जीवनभर ले सकता है। –

उत्तर

4

लिंक किए गए बाहरी तालिकाओं का उपयोग करते समय मुझे यह समस्या थी। सीमा तक पहुंच गई थी क्योंकि लगभग 10 एक्सेल फाइलों का इस्तेमाल अलग-अलग प्रश्नों से बार-बार किया जाता था। इसलिए खुली तालिकाओं की संख्या प्रश्नों और तालिकाओं के उत्पाद को कम या कम थी।

मुझे लगता है कि यूनियनों का उपयोग करके इस समस्या को भी गुणा करता है।

मेरे लिए समाधान पहले से जुड़े मूल तालिकाओं में लिंक किए गए एक्सेल टेबल की प्रतिलिपि बनाना था। फिर देशी टेबल के साथ एक ही प्रश्न चलाएं।

+0

जर्मन संदेश 'फेहरर 3048 है: मेहर डेटेनबंकेन कोएनएन एनआईटीटी जिओफनेट वेरडन' बीटीडब्ल्यू। – msjav

+0

वाह, और इस तरह से प्रश्नों को संपादित और निष्पादित करने के लिए यह तेजी से बढ़ता है। यह थोड़ा गड़बड़ है कि एक्सेस इसे अपने आप संभाल नहीं पाएगा। लेकिन मेरे मामले के लिए यह समाधान ठीक है। – Christian

1

इस समस्या के आसपास एकमात्र वास्तविक तरीका टेबल के एक अस्थायी सेट का उपयोग करना है। अपने यूनियनों से परिणामों को temp तालिकाओं में डालें और फिर प्रति क्वेरी तालिकाओं की संख्या सीमित करने के लिए उन का उपयोग करें। मैं आमतौर पर अंडरस्कोर (_tmpCustomers) के साथ अपनी temp टेबल उपसर्ग करता हूं और फिर जब मैं कर रहा हूं तो उन्हें नष्ट कर देता हूं।

+0

उह, मुझे पहले इस जवाब को समझ में नहीं आया। मुझे लगता है कि आप msjav की तरह ही मतलब था? – Christian

+0

हां, लेकिन मेरा जवाब बहुत स्पष्ट नहीं था ... वास्तव में उदाहरणों का उपयोग करना चाहिए, मैं भविष्य में उदाहरणों में मदद करने के लिए उदाहरण शामिल करूंगा :) – twoleggedhorse

0

आपका एप्लिकेशन एक्सेस डेटाबेस पर बहुत से कनेक्शन खोलने का प्रयास कर रहा है। यह केवल आपके एसक्यूएल स्टेटमेंट में टेबल नहीं है जो 2048 तक जोड़ता है, यहां तक ​​कि रूपों, रिपोर्ट्स, कंबोबॉक्स, अनलॉक रिकॉर्ड्स इत्यादि आपके आवेदन द्वारा उपयोग किए गए कनेक्शन की संख्या में शामिल होते हैं। कुछ चीजें जिन्हें आप यहां आज़मा सकते हैं:
1. संसाधन बंद करें (जैसे रिकॉर्ड सेट) जिन्हें आप वास्तव में उपयोग नहीं कर रहे हैं।
2. यदि आप डोमेन aggergate फ़ंक्शंस (जैसे DLookup) का उपयोग कर रहे हैं, तो इसे Elookup के साथ बदलें क्योंकि यह स्पष्ट रूप से स्वयं के बाद साफ़ हो जाता है।
3. आप टेम्पलेट टेबल्स का उपयोग करने के लिए अपने एसक्यूएल कोड को संशोधित कर सकते हैं।
उम्मीद है कि यह मदद करता है।

+0

बंद संसाधनों में मदद नहीं होगी, मुझे लगता है। मैं एप्लिकेशन शुरू कर सकता हूं, एक क्वेरी निष्पादित कर सकता हूं (कोई vba नहीं) और त्रुटि होती है। अस्थायी सारणी कैसे मदद कर सकती हैं? क्या आप एक उदाहरण बना सकते हैं? – Christian

2

अक्सर, यह कई उप-प्रारूपों और/या comboboxes/listboxes के साथ बड़े/जटिल रूपों के साथ होता है।

सौरभ कहते हैं कि क्या करने की कोशिश करें। वैसे भी अच्छी चीजें हैं। लेकिन मुझे लगता है कि ये परिवर्तन आपकी समस्या का समाधान नहीं करेंगे।

हाल ही में, मैं एक ही समस्या को हल करता हूं। मैंने पहचाना कि हमेशा तब होता है जब दिया गया फॉर्म खोला जाता है। इस रूप में कई सबफॉर्म और combos थे।

पहले। अपना फॉर्म या फॉर्म सरल बनाने का प्रयास करें: क्या आपको वास्तव में सभी सबफॉर्म की आवश्यकता है? सभी सबफॉर्म हमेशा लोड किया जाना चाहिए?

मैं एक टैब नियंत्रण के अलग-अलग पृष्ठों में सबफॉर्म वितरित करने में अपनी समस्या का समाधान करता हूं। फिर बदलें ईवेंट में गतिशील रूप से सबफॉर्म लोड और अनलोड करें।

प्रारंभ में, केवल पहले पृष्ठ पर उप-प्रारूपों में "SourceObject" संपत्ति असाइन की जानी चाहिए। बाकी, इस संपत्ति को खाली है।

परिवर्तन घटना में, कुछ इस तरह से करने की कोशिश:

Private Sub TabControl_Change 
    Dim pgn As Access.Page 
... 
    For Each varCtlSubform In Array(Me.Subform1, Me.Subform1, ...) 
     Set pgn = varCtlSubform.Parent 
     If pgn.PageIndex <> Me.TabControl.value Then 
      if varCtlSubform.SourceObject <> "" Then 
       varCtlSubform.SourceObject = "" 
      End if 
     Else 
      If varCtlSubform.SourceObject <> ctlSubform.Tag then 
       varCtlSubform.SourceObject = ctlSubform.Tag 
      End if 
     End If 
    Next 
... 
End sub 

यह सभी उप-प्रपत्र नियंत्रण पर पुनरावृति करने के लिए एक सामान्य कार्य है। यदि सक्रिय पृष्ठ में नहीं है, तो इसे अनलोड करें। अन्य मामले में, टैग संपत्ति से स्रोत ऑब्जेक्ट लें।

आप यदि "Subform1" उतार दिया जाता है तो आप इस तरह कुछ के साथ एक त्रुटि मिल जाएगा, उतार subforms, यानी के लिए संदर्भ से बचने के लिए की आवश्यकता होगी: Me.Subform1.Form.InvoiceId

यह परिवर्तन अन्य है लाभ। आपका फॉर्म तेजी से लोड होगा और नेविगेशन रिकॉर्ड तेज होगा।

+0

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

+0

आपकी क्वेरी कुल या VBA फ़ंक्शन को कॉल कर सकती है। क्या आप इस क्वेरी के एसक्यूएल पोस्ट कर सकते हैं? आप विशिष्ट क्वेरी का जिक्र करते हैं। केवल इस प्रश्न के साथ? अन्य प्रश्नों के साथ भी? – ricardohzsz

+0

क्वेरी का कोड SELECT * एक यूनियन से सभी चयन * बी से है ... - लेकिन msjav के उत्तर ने वास्तविक समस्या को हल किया है। – Christian

1

मैं अपने अद्भुत कोड के लिए ricardohzsz धन्यवाद देना चाहता हूं! यह वास्तव में मुझे अपने डेटाबेस प्रदर्शन में सुधार करने के साथ-साथ त्रुटि 3048 को खत्म करने में मदद करता है।

मैं पोस्ट अप को वोट दूंगा लेकिन मेरे पास मतदान करने के लिए यहां पर्याप्त प्रतिष्ठा नहीं है।

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

Private Sub TabControlMain_Change() 

Dim pgn As Access.Page 
Dim sbf As SubForm 
Dim strSubForm As String 
Dim VarCtlSubform As Variant 


For Each VarCtlSubform In Array(Me.sf1, Me.sf2, Me.sf3, etc) 
Set pgn = VarCtlSubform.Parent 
    If pgn.PageIndex <> Me.TabControlMain.Value Then 
     If VarCtlSubform.SourceObject <> "" Then 
      VarCtlSubform.SourceObject = "" 
     End If 
    Else 

     If VarCtlSubform.SourceObject <> VarCtlSubform.Tag Then 
      VarCtlSubform.SourceObject = VarCtlSubform.Tag 

      strSubForm = VarCtlSubform.Name 
      Set sbf = Screen.ActiveForm.Controls(strSubForm) 
      sbf.Form.AllowAdditions = True 
      sbf.Form.AllowEdits = True 
     End If 
    End If 
Next 

End Sub

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