MS Access 2010:“无法打开更多的数据库”。

虽然挣扎与一个单一的遗留MS Access应用程序,我面临这个奇怪的错误:

Cannot open any more databases. 

该应用程序广泛使用UNION SQL语句。 所以这似乎导致访问达到2048张开放表的限制。 除了摆脱这些工会之外,还有其他的机会吗?

使用链接的外部表时,我遇到了这个问题。 由于不同的查询一次又一次地使用了大约10个excel文件,所以达到了极限。 所以开放表的数量或多或less是查询和表的结果。

我想象使用工会也会增加这个问题。

对我来说,解决scheme是首先将链接的Excel表复制到Access本机表中。 然后用本地表运行相同的查询。

通常情况下,这种情况发生在具有许多子表单和/或combobox/列表框的大/复杂表单上。

试着做一下Saurabh说的话。 无论如何,这是好事。 但我认为这些改变不会解决你的问题。

最近,我解决了同样的问题。 我发现,当一个给定的表格被打开时,总会发生。 这个表单有很多子表单和组合。

第一。 尽量让你的表单或表单更简单:你真的需要所有的子表单吗? 所有子表单必须始终加载?

我解决了我的问题分布在一个选项卡控件的不同页面中的子表单。 然后在Change事件中dynamic加载和卸载子窗体。

最初,只有第一页上的子表单必须具有分配的“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

这个改变还有其他好处。 您的表单将加载更快,logging导航将更快。

解决这个问题的唯一方法就是使用一组临时表。 将结果从您的联合插入到临时表中,然后使用这些来限制每个查询的表的数量。 我通常在我的临时表中加一个下划线(_tmpCustomers),然后在完成时将它们销毁。

我要感谢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 

结束小组

您的应用程序正试图打开太多的连接到Access数据库。 它不仅仅是你的sql语句中的表格总计2048,甚至表格,报告,combobox,未closures的logging集等等,都会增加你的应用程序使用的连接数。 你可以在这里尝试几件事情:
1.closures你不真正使用的资源(例如logging集)。
2.如果您正在使用域aggergate函数(例如DLookup),请使用Elookup进行更改,因为它自己清理完毕。
你可以修改你的SQL代码来使用临时表。
希望能帮助到你。