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

时间:2012-09-25 08:41:08

标签: sql excel ms-access ms-access-2010

在努力使用单个传统MS Access应用程序时,我遇到了这个奇怪的错误:

Cannot open any more databases.

该应用程序广泛使用UNION sql语句。所以这似乎导致访问量达到2048个开放表的限制。除了摆脱这些工会之外的任何其他机会?

6 个答案:

答案 0 :(得分:4)

使用链接外部表时遇到此问题。达到了限制,因为不同的查询一次又一次地使用了大约10个excel文件。因此,打开表的数量或多或少是查询和表的产物。

我想使用工会也可以解决这个问题。

我的解决方案是首先将链接的excel表复制到Access本机表中。然后使用本机表运行相同的查询。

答案 1 :(得分: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

此更改还有其他好处。您的表单加载速度更快,记录导航速度更快。

答案 2 :(得分:1)

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

答案 3 :(得分: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

答案 4 :(得分:0)

您的应用程序正在尝试打开与Access数据库的过多连接。它不仅仅是你的sql语句中的表总计加起来为2048,甚至表单,报表,组合框,未闭合的记录集等加起来就是应用程序使用的连接数。你可以在这里尝试一些事情:
1.关闭您并未真正使用的资源(例如记录集) 2.如果您正在使用域名aggergate功能(例如DLookup),请使用Elookup进行更改,因为它会明确地清除它。
3.您可以修改您的SQL代码以使用临时表 希望它有所帮助。

答案 5 :(得分:0)

您需要评估UNION查询的每个部分以及它依赖的任何其他查询。通过创建一个临时表来代表具有多个联接表的查询,可以得到改进,而改用临时表。

当我开始使用Access开发时,我习惯于进行大型的非规范化snowflake查询,并将它们用作报告和列表框的源。我没有超过100,000条记录的表,并且数据库运行很快。后来,我开始遇到烦人的“无法打开更多数据库”错误,并发现了自己的错误方式。

我创建了一个表单,该表单将帮助您跟踪已使用的数据库连接数以及剩余的数据库连接数。如果将此表单添加到数据库中,并在打开查询和其他对象后单击重新查询,则将能够找到使用大量连接的对象。

enter image description here

请注意,对本地表或查询对象的每个引用都使用1个连接。对链接表的引用使用2个连接。连接两个链接表的查询将使用5个连接。如果您的联合中的许多其他查询都调用了该查询,则该数字将快速累加。也许您不需要子查询中联接表中的任何字段。在这种情况下,您可以进行新的查询。

我在网上阅读了很多有关此的内容,有些人认为Access / Jet具有大约2,000个TableID,但是该数字与我的表单所报告的不匹配。我的表格所报告的数字与错误完全吻合。它的计数可能与TableID的计数不同,但是它提供了一个精确的量规来测量打开新对象时正在使用的连接量。

您可以阅读更多信息并从此处下载:

https://access.wordpress.com/2014/04/01/how-many-database-connections-are-still-available-in-an-access-database/