VBA调试 - 查看所有打开的DAO记录集

时间:2013-11-06 17:06:57

标签: vba ms-access recordset

我正在使用Access 2010数据库,其中DAO记录集用于创建新记录。但是,代码无法识别新创建的记录 - 它会找到另一条记录。

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

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

我想Stop代码并查看打开的DAO记录集列表。如何使用“立即”窗口查询所有打开的记录集?必须有一个准备好查看的集合。

解决

我接受了一个有用的答案,因为它在处理我的帖子方面做得很好。虽然我受益匪浅,但我需要的答案却在不同的方向--VBA对象参考。看看我在Gord的回答下的评论。

3 个答案:

答案 0 :(得分:3)

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

“Recordsets集合包含Connection或Database对象中的所有打开的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

答案 1 :(得分:3)

打开本地窗口。

Open Locals Window

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

Locals Window

答案 2 :(得分:2)

这是无法使用实际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创建了一个Watch,它什么都没显示:

noCdb.png

但如果我为cdb.Recordsets创建了一个Watch,我可以看到我创建的Recordset

cdb.png

编辑重新评论

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

dbe.png