您应该能够使用表格 BeforeUpdate 和 AfterUpdate 事件来检测添加和编辑。就删除而言,您需要使用以下形式的删除事件之一:BeforeDelConfirm、AfterDelConfirm 或 Delete。
Dirty 事件在检测用户何时开始编辑记录时也很方便。
我认为您确实需要将您的第一个 Recordset 对象设置为表单级对象,而不是将其放入表单的 Load 事件中。
Dim rst As Object
Private Sub Form_Load()
Set rst = CreateObject("ADODB.Recordset")
rst.CursorLocation = adUseClient
'...edit out connection
rst.Open sql, mConnection, adOpenStatic, adLockBatchOptimistic
set rst.ActiveConnection = Nothing
'You can close your connection object here now
Set Me.Recordset = rst
End Sub
''Edit records on the form and now click save
Private Sub cmdSave_Click()
Set rst.ActiveConnection = GetConnection
rst.UpdateBatch
End Sub
Private Sub Form_Unload()
'Offer to do batch update here if changes have been made to the recordset
rst.Close
Set rst = Nothing
End Sub
您可能会考虑使用 AuditTrail 函数来记录更改。但是,如果用户不执行批量更新,这些更改实际上不会对数据库进行,因此我不确定您将如何以简单、轻松的方式记录更改。
以下是一些应该可以工作的审计跟踪代码:
http://www.everythingaccess.com/tutorials.asp?ID=Creating-an-Audit-Trail-(Source-Code)
我看到 Fenton 先生质疑为什么需要断开连接的 ADO 记录集而不是使用 MS Access 的内置 DAO 绑定。我确实知道在某些情况下 ADO 记录集是有意义的,但我认为它们很少而且相差甚远。绑定到诸如 XML 文件之类的记录源可能就是一个示例。我个人喜欢在绑定到远程 SQL Server 时使用它。它非常适合让 Access 与云中 Web 服务器上的 SQL Server 数据库通信。但是,您可以对 ODBC 表执行相同的操作,因此使用 ADO 记录集并没有真正令人信服的理由,只是管理 DSN 或 ODBC 表链接确实存在挑战。
编辑1:
为了回答 OP 对事件没有捕获大量删除和大量粘贴的担忧。 Delete 事件针对每条选择删除的记录触发,AfterDelConfirm 事件在用户按下“是”后触发。使用粘贴,您就没有那么幸运了,因为在用户确认粘贴后不会触发任何事件。一种解决方法是禁用表单中的添加并使用其他方法插入新记录。
您可能会考虑的另一个选项是使用 ADO 记录集事件。似乎这些事件可能会做所有事情,除了一件非常关键的事情 - 为正在编辑、删除或插入的每条记录返回一个书签或主键。
第三个选项是为每条记录设置一个 DateTimeModified。然后,您几乎可以随时使用代码来遍历记录集并记录尚未记录的更改。只需创建一个记录集克隆并使用记录集的 Filter 方法,如下所示:
rst.Filter "DateTimeModified > " & LastLoggedDateTime
现在遍历过滤的记录集并记录记录。如有必要,您可以将原始记录集的副本保留在内存中(只读)并将其用于比较。看看这个帖子:compare two record sets in vb6
我同意没有真正简单的方法来做你想做的事。它似乎相当复杂。