在处理一个老旧的MS Access应用程序时,我遇到了这个奇怪的错误:
Cannot open any more databases.
该应用程序广泛使用UNION
SQL语句。因此,这似乎会导致访问命中2048个打开表的限制。是否有其他方法除了摆脱这些联合?
在处理一个老旧的MS Access应用程序时,我遇到了这个奇怪的错误:
Cannot open any more databases.
该应用程序广泛使用UNION
SQL语句。因此,这似乎会导致访问命中2048个打开表的限制。是否有其他方法除了摆脱这些联合?
使用外部链接表时,我遇到了这个问题。由于大约有10个Excel文件被不同的查询一遍又一遍地使用,因此打开的表的数量更多或更少是查询和表的乘积。
我想联合查询也会加剧这个问题。
对我来说,解决办法是先将链接的Excel表复制到Access本地表中,然后使用本地表运行完全相同的查询。
Fehler 3048: Mehr Datenbanken können nicht geöffnet werden
。 - msjavPrivate 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
此更改有其他好处。您的表单将加载更快,并且记录导航将更快。
当我开始使用 Access 进行开发时,我有一个习惯,即制作大型非规范化的 snowflake 查询,并将它们用作报表和列表框的数据源。我的数据库中没有超过 100,000 条记录的表,因此数据库运行速度很快。后来,我开始遇到令人烦恼的“无法打开更多数据库”错误,并发现了我的错误。
我创建了一个表单,可以帮助跟踪您已使用的数据库连接数以及剩余的连接数。如果将此表单添加到您的数据库中,并在打开查询和其他对象后单击 重新查询,则您将能够找到使用大量连接的对象。
请注意,对本地表或查询对象的每个引用都使用1个连接。对链接表的引用使用2个连接。连接两个链接表的查询将使用5个连接。如果该查询被您的 union 中的许多其他查询调用,则数字会快速增加。也许您在子查询中不需要联接表中的任何字段。在这种情况下,您可以创建一个新的查询。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
您的应用程序尝试打开太多连接到Access数据库。不仅是您SQL语句中的表达式总数达到了2048,甚至包括表单、报表、组合框、未关闭的记录集等也会增加应用程序使用的连接数。以下是您可以尝试的几件事情:
1. 关闭您实际上没有使用的资源(例如记录集)。
2. 如果您正在使用域聚合函数(例如DLookup),请改用Elookup,因为它会明确地在自身清理后进行清理。
3. 您可以修改您的SQL代码以使用Temp Tables。
希望这有所帮助。
UNION ALL
比UNION
更快且使用的开销更少。 - Ben