【问题标题】:VBA debugging -- see all open DAO recordsetsVBA 调试——查看所有打开的 DAO 记录集
【发布时间】:2013-11-06 17:06:57
【问题描述】:

我正在使用 DAO 记录集创建新记录的 Access 2010 数据库。然而,代码无法识别新创建的记录——它找到了另一条记录。

开发人员很草率:他没有关闭记录集。代码循环了几次,我相当肯定记录集的多个实例是问题的原因。

Set rsMain = CurrentDb().OpenRecordset(strSQL, dbOpenDynaset)
         '      ... create new record ....
'rsMain.Close          '' not included, unfortunately
'Set rsMain = Nothing  '' not included, unfortunately

我想Stop 代码并查看打开的 DAO 记录集列表。如何使用即时窗口查询所有打开的记录集?必须有一个可供查看的集合。

已解决

我接受了一个很有帮助的答案,因为它很好地解决了我的帖子。虽然我从中受益,但我需要的答案却在另一个方向——VBA 对象引用。在 Gord 的回答下查看我的 cmets。

【问题讨论】:

    标签: vba ms-access recordset


    【解决方案1】:

    这取决于您打开记录集的方式。

    “Recordsets 集合包含连接或数据库对象中所有打开的 Recordset 对象。”

    您应该将 CurrentDB() 保存到变量中,以免丢失信息,因为每次调用它都会创建新的数据库引用。

    或者声明类似这个函数的东西,它应该替换你所有的 CurrentDB() 调用^

    Public Function CurrDB() As Database
        Static mCurrDb As Database
        If mCurrDb Is Nothing Then
            Set mCurrDb = CurrentDb 
            Debug.Print Now, "static mCurrDB inited for ", hWndAccessApp
        End If
        Set CurrDB = mCurrDb
    End Function
    

    在 Q 的代码中:

    Set rsMain = CurrDB().OpenRecordset(strSQL, dbOpenDynaset)
             '      ... create new record ....
    'rsMain.Close          '' not included, unfortunately
    'Set rsMain = Nothing  '' not included, unfortunately
    

    调试输出写入函数为:

    Public Sub  OpenedRST()
        dim rst as DAO.Recordset
    
        For each rst in CurrDB().Recordsets
           debug.print rst.name
        next rst
    end sub
    

    【讨论】:

    • 你测试过你的代码吗?它对我不起作用。一方面,DAO.Recordset 中没有 .SQL 属性。 (如果有的话,SQL 位于 .Name 属性中。)
    • 未能声明数据库变量可能导致该错误。
    • 代码现在符合您的说明,除了我在本地声明 database 对象。记录集和数据库被清除。行为是一样的。我现在没有任何理由认为问题是记录集的多个实例化。我想我会开始一个新的帖子。
    【解决方案2】:

    打开本地窗口。

    然后您可以在运行代码时监控变量。

    【讨论】:

    • 谢谢你,HansUp。我几乎在 OP 中提到了我对 Locals Window 的恐惧回避。 :-P
    【解决方案3】:

    这是未能使用实际 DAO.Database 对象可能导致混淆的情况之一。考虑以下代码:

    Sub liminal()
        Dim cdb As DAO.Database, rst As DAO.Recordset
        Set cdb = CurrentDb
        Set rst = cdb.OpenRecordset("SELECT * FROM Clients", dbOpenSnapshot)
        Debug.Print "-----"
        rst.Close
        Set rst = Nothing
        Set cdb = Nothing
    End Sub
    

    如果我在Debug.Print 行设置断点然后运行代码,我可以打开监视窗口来查看发生了什么。如果我为CurrentDb.Recordsets 创建一个手表,它什么也不显示:

    但如果我为 cdb.Recordsets 创建一个 Watch,我可以看到我创建的记录集

    编辑回复:评论

    有趣的是,DBEngine(0)(0).Recordsets 上的 Watch 也没有显示任何内容:

    【讨论】:

    • 这是因为:CurrentDb 方法创建了当前数据库的另一个实例,而 DBEngine(0)(0) 语法指的是当前数据库的打开副本。 CurrentDb 方法使您可以创建多个数据库类型的变量来引用当前数据库。
    • @4dmonster 奇怪,但是DBEngine(0)(0).Recordsets 上的手表也没有显示任何内容......
    • 您是否将 Set cdb = CurrentDb 更改为 Set cdb = DBEngine(0)(0) ?或者如果你保留了它,你应该在 DBEngine(0)(1).Recordsets 上观看
    • 我错过了答案更新。尝试在最后一种情况下检查 DBEngine(0)(1).Recordsets。因为对 Currentdb 的调用创建了新的引用,并且它具有 (1) 索引。
    • 我把dao. 作为Database 的前缀。 VBE 未能自动更正为 DAO.。所以我更改了库引用——删除了Microsoft Office 14.0 Access Daabase Engine Object Library 并放入了“Microsfot DAO 3.6 Object Library”。语法已自动更正...错误保持不变...但是,我有什么问题吗?
    猜你喜欢
    • 2010-10-14
    • 2011-04-25
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多