2

我正在使用 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 对象引用。在戈德的回答下查看我的评论。

4

3 回答 3

4

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

“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
于 2013-11-06T17:13:44.237 回答
3

打开本地窗口。

打开局部变量窗口

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

当地人窗口

于 2013-11-06T17:32:57.987 回答
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然后运行代码,我可以打开 Watch Window 以查看发生了什么。如果我为它创建一个 WatchCurrentDb.Recordsets什么都不会显示:

noCdb.png

但是如果我创建一个 Watch forcdb.Recordsets我可以看到我创建的 Recordset

cdb.png

编辑回复:评论

有趣的是,Watch onDBEngine(0)(0).Recordsets也没有显示:

dbe.png

于 2013-11-06T17:58:13.543 回答