如何获取数据库记录集/引用的计数(调试错误#3048 - 无法打开更多数据库)?

Posted

技术标签:

【中文标题】如何获取数据库记录集/引用的计数(调试错误#3048 - 无法打开更多数据库)?【英文标题】:How to get count of db recordsets/references (to debug err #3048 - can't open more databases)? 【发布时间】:2011-11-28 15:02:03 【问题描述】:

我开始收到错误 3048 - 无法打开更多数据库。 我似乎已经通过实现单个静态数据库变量来驯服它 在David Fenton's example here 之后的函数“dbLocal()”中。

我仍想监控数据库引用的数量,以了解我与 Access 中的 2048 限制的接近程度。我曾尝试使用 .Recordsets.Count 但它总是返回零。如何确定 Access 内部使用的引用/记录集计数?

我尝试查看的一个地方是“dbLocal()”函数。在这里精简到最低限度(在我的代码中,我使用了 Fenton 的完整示例),我正在尝试这个:

Public Function dbLocal() As DAO.Database

    Static dbCurrent As DAO.Database

    If dbCurrent Is Nothing Then
        Set dbCurrent = CurrentDb()
    End If
    Set CurDb = dbCurrent
    Debug.Print dbCurrent.Recordsets.Count

End Function

但它总是打印零。即使它有效,这也不是我真正想要的,因为(如果我理解正确的话)Access 正在维护自己的会计,其中包括由于查询、组合框等引起的引用,而我的静态变量只会“知道”由于 VBA 语句显式使用此 dbLocal() 函数而导致的引用。

有没有办法查看 Access 的内部会计,以了解我离用完 2048 最大值还有多远?

如果重要:Windows XP Pro SP3;访问 2010 32 位版本 14.0.6024.1000 SP1 MSO 14.0.6112.5000。

【问题讨论】:

遗憾的是,上个月去世的大卫·W·芬顿 (David W. Fenton) 没有给你答复:( @onedaywhen 太伤心了。我想知道他为什么不在身边。不知道有没有纪念页? @Remou:我也是,我找到了this 和this。我真的会想念他的。 【参考方案1】:

一种方法是继续打开记录集,直到出现错误:

Function TablesAvailable() As Integer
Dim i As Integer, rs As DAO.Recordset, rsColl As Collection

    On Error GoTo Err_TablesAvailable

    Set rsColl = New Collection
    Do While i < 4096
        i = i + 1
        Set rs = CurrentDb.OpenRecordset("SELECT 1")
        rsColl.Add rs
    Loop

Exit_TablesAvailable:
    For Each rs In rsColl
        rs.Close
        Set rs = Nothing
    Next rs
    Exit Function
Err_TablesAvailable:
    Select Case Err.Number
    Case 3048 'Cannot open any more databases.
        TablesAvailable = i
    Case Else
        MsgBox Err.Number & ": " & Err.Description
    End Select
    Resume Exit_TablesAvailable
End Function

【讨论】:

我现在就试一试。不用说,我很好奇 .Recordsets.Count (或一些直接等效的)是否/如何可以工作(因为应该有办法!),但我喜欢你的开箱即用接近它应该给我我开始寻找的洞察力,即我离头撞到天花板有多近。谢谢! 这段代码似乎可以工作,尽管它是在一个新的空白数据库上运行的(没有表、查询或表单......只是一个包含这个函数的模块,从即时窗口运行该函数) 仅表示 252 个未使用的引用/记录集。在打开任何表格之前,我在当前的应用程序中获得了相同的号码。这个数字可以正确吗?我已经看到 2048 作为最近版本的 Access 中可用的最大值;在旧版本中显然是 1024。 Access 可以在打开表单之前消耗近 1800 个吗?! 我和你做了同样的事情,得到了相似的结果。并且有同样的想法。这让我想知道实际数字是否应该是 256 而不是 2048/1096。你还记得你在哪里看到限制是 2048 吗?我在任何 Microsoft 文档中都找不到它。 例如:here 和 here 以及来自this Google search的其他人 我得到了和你一样的结论,虽然我不想让事情去假设......希望有人迟早会在这里权衡一些更明确的信息。同时,我将假设无论 2048 限制是多少,实际上我有更多类似 256 可以使用。使用您的功能,当我的应用程序运行时 - 一个包含许多控件和子窗体的主窗体 - 我只剩下 40 个未使用的插槽,如果我打开其他插槽,我发现它会低至 20 多岁形式。我猜如果限制是~250,那么我还剩下~10%?!比 Err3048 好...

以上是关于如何获取数据库记录集/引用的计数(调试错误#3048 - 无法打开更多数据库)?的主要内容,如果未能解决你的问题,请参考以下文章

获取结果集值的计数[重复]

SSIS:如何调试在脚本组件内部引用的自定义程序集

DPDK mbuf引用计数出错的分析

如何调试错误计数项目的程序?

如何获取 NSObject 的引用计数?

节点快递:如何找出给定etag的状态是不是为304