我正在使用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的回答下的评论。
答案 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)
打开本地窗口。
然后,您可以在运行代码时监视变量。
答案 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,它什么都没显示:
但如果我为cdb.Recordsets
创建了一个Watch,我可以看到我创建的Recordset
编辑重新评论
有趣的是,DBEngine(0)(0).Recordsets
上的观看也没有显示任何内容: