2012-09-25 64 views
8

雖然與我面對這個奇怪的錯誤一個傳統MS Access應用程序掙扎:MS Access 2010:「無法打開更多數據庫。」

Cannot open any more databases. 

應用廣泛使用的UNION SQL語句。所以這似乎導致訪問達到2048張開放表的限制。除了擺脫這些工會之外,還有其他的機會嗎?

+3

哇,2048表..出於興趣做事情怎麼變得如此糟糕? –

+0

當然,DB中沒有那麼多表。有少於50個表和大約100個查詢。 – Christian

+0

儘管Kieren的亮點是,我驚訝的是沒有提供的答案更傾向於認真重新考慮UNION SQL,如果數據結構已經過優化,那麼您應該永遠不需要結束這麼大的查詢。特別是在訪問方面不好,因爲它全部在本地運行並可能需要一生。 –

回答

4

我在使用鏈接的外部表時遇到了這個問題。由於大約10個excel文件一遍又一遍地被不同的查詢使用,因此達到了限制。所以開放表的數量或多或少都是查詢和表的結果。

我想象使用工會也會增加這個問題。

我的解決方案是首先將鏈接的Excel表複製到Access本機表中。然後用本地表運行相同的查詢。

+0

德國的消息是「Fehler 3048:Mehr Datenbankenkönnennichtgeöffnetwerden' btw。 – msjav

+0

哇,這樣可以更快地編輯和執行查詢。 Access無法自行處理這件事有點蹩腳。但對我來說這個解決方案是可以的。 – Christian

1

解決此問題的唯一方法是使用一組臨時表。將結果從聯合中插入臨時表中,然後使用這些來限制每個查詢的表的數量。我通常在我的臨時表中加一個下劃線(_tmpCustomers),然後在完成時銷燬它們。

+0

呃,我以前不明白這個答案。我想你的意思是像msjav一樣? – Christian

+0

是的,但我的答案不是很清楚......應該已經使用了實例,我將在未來包括示例以幫助:) – twoleggedhorse

0

您的應用程序正試圖打開太多連接到Access數據庫。它不僅僅是你的sql語句中的表格總計2048,甚至表單,報表,組合框,未關閉的記錄集等都會增加你的應用程序使用的連接數。您可以在這裏嘗試幾件事:
1.關閉您並未真正使用的資源(例如記錄集)。
2.如果您正在使用域aggergate函數(例如DLookup),請使用Elookup對其進行更改,因爲它會在其自身之後明確清除。
3.您可以修改您的sql代碼以使用臨時表。
希望它有幫助。

+0

關閉資源不會幫助,我想。我可以啓動應用程序,執行一個查詢(無vba)併發生錯誤。 臨時表如何在這裏幫助?你能舉個例子嗎? – Christian

2

通常,這種情況會發生在具有許多子表單和/或組合框/列表框的大/複雜表單中。

嘗試做什麼Saurabh說。無論如何,這都是好事。但我認爲這些改變不會解決您的問題。

最近,我解決了同樣的問題。我發現,當給定的表單被打開時總會發生。這種形式有許多子表單和組合。

首先。儘量讓你的表單或表單更簡單:你真的需要所有的子表單嗎?所有子表單必須始終加載?

我解決了我的問題,在一個選項卡控件的不同頁面中分發子窗體。然後在Change事件中動態加載和卸載子窗體。

最初,只有第一頁上的子表單必須分配「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」被卸載,你會得到一個錯誤,像這樣的事情: Me.Subform1.Form.InvoiceId

這種變化有其他好處。你的表單加載速度更快,記錄導航速度更快。

+0

實際上,沒有涉及任何表單或vba代碼。打開accdb並執行一個(特定的)查詢就足以彈出錯誤消息。如果我將依賴查詢的結果放到一個表中,並使用修改後的查詢版本,它就可以工作。 – Christian

+0

您的查詢可能會調用聚合或VBA函數。你可以發佈這個查詢的SQL?你提到具體的查詢。只有這個查詢?還有其他疑問? – ricardohzsz

+0

查詢的代碼就像SELECT * FROM A UNION ALL SELECT * FROM B ... - 但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 

末次