雖然與我面對這個奇怪的錯誤一個傳統MS Access應用程序掙扎:MS Access 2010:「無法打開更多數據庫。」
Cannot open any more databases.
應用廣泛使用的UNION
SQL語句。所以這似乎導致訪問達到2048張開放表的限制。除了擺脫這些工會之外,還有其他的機會嗎?
雖然與我面對這個奇怪的錯誤一個傳統MS Access應用程序掙扎:MS Access 2010:「無法打開更多數據庫。」
Cannot open any more databases.
應用廣泛使用的UNION
SQL語句。所以這似乎導致訪問達到2048張開放表的限制。除了擺脫這些工會之外,還有其他的機會嗎?
解決此問題的唯一方法是使用一組臨時表。將結果從聯合中插入臨時表中,然後使用這些來限制每個查詢的表的數量。我通常在我的臨時表中加一個下劃線(_tmpCustomers),然後在完成時銷燬它們。
呃,我以前不明白這個答案。我想你的意思是像msjav一樣? – Christian
是的,但我的答案不是很清楚......應該已經使用了實例,我將在未來包括示例以幫助:) – twoleggedhorse
您的應用程序正試圖打開太多連接到Access數據庫。它不僅僅是你的sql語句中的表格總計2048,甚至表單,報表,組合框,未關閉的記錄集等都會增加你的應用程序使用的連接數。您可以在這裏嘗試幾件事:
1.關閉您並未真正使用的資源(例如記錄集)。
2.如果您正在使用域aggergate函數(例如DLookup),請使用Elookup對其進行更改,因爲它會在其自身之後明確清除。
3.您可以修改您的sql代碼以使用臨時表。
希望它有幫助。
關閉資源不會幫助,我想。我可以啓動應用程序,執行一個查詢(無vba)併發生錯誤。 臨時表如何在這裏幫助?你能舉個例子嗎? – Christian
通常,這種情況會發生在具有許多子表單和/或組合框/列表框的大/複雜表單中。
嘗試做什麼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
這種變化有其他好處。你的表單加載速度更快,記錄導航速度更快。
實際上,沒有涉及任何表單或vba代碼。打開accdb並執行一個(特定的)查詢就足以彈出錯誤消息。如果我將依賴查詢的結果放到一個表中,並使用修改後的查詢版本,它就可以工作。 – Christian
您的查詢可能會調用聚合或VBA函數。你可以發佈這個查詢的SQL?你提到具體的查詢。只有這個查詢?還有其他疑問? – ricardohzsz
查詢的代碼就像SELECT * FROM A UNION ALL SELECT * FROM B ... - 但msjav的答案很好地解決了實際問題。 – Christian
我要感謝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
末次
哇,2048表..出於興趣做事情怎麼變得如此糟糕? –
當然,DB中沒有那麼多表。有少於50個表和大約100個查詢。 – Christian
儘管Kieren的亮點是,我驚訝的是沒有提供的答案更傾向於認真重新考慮UNION SQL,如果數據結構已經過優化,那麼您應該永遠不需要結束這麼大的查詢。特別是在訪問方面不好,因爲它全部在本地運行並可能需要一生。 –