dma*_*uca 5 vba ado ms-access-2007 recordset
我似乎对这个问题一无所知。我可以将 ADO 记录集附加到表单,但我不确定如何处理更新。我不想只使用 UpdateBatch,我希望能够检测出于日志记录目的而更改的内容。任何人都可以指出我正确的方向吗?
提供的 SQL 包含一个 Key 字段,它是一个名为“ID”的自动编号。
Private Sub Form_Load()
Dim rst as Object
Set rst = CreateObject("ADODB.Recordset")
rst.CursorLocation = adUseClient
'...edit out connection
rst.Open sql, mConnection, adOpenStatic, adLockBatchOptimistic
set rst.ActiveConnection = Nothing
Set Me.Recordset = rst
End Sub
''Edit records on the form and now click save
Private Sub cmdSave_Click()
Dim rst As Object
Set rst = Me.Recordset
Set rst.ActiveConnection = GetConnection
rst.UpdateBatch
'How do I detect deleted, added, or modified records for logging?
End Sub
Run Code Online (Sandbox Code Playgroud)
您应该能够使用表单 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
Run Code Online (Sandbox Code Playgroud)
您可能会考虑使用 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 表做同样的事情,因此除了管理 DSN 或 ODBC 表链接确实存在挑战之外,并没有真正令人信服的理由使用 ADO 记录集。
编辑 1:
为了回应 OP 对事件的关注,无法捕获大量删除和大量粘贴。Delete 事件为每个选择删除的记录触发,AfterDelConfirm 事件在用户按下“是”后触发。使用粘贴,您就没有那么幸运了,因为在用户确认粘贴后不会触发任何事件。一种解决方法是禁用表单中的添加项并使用其他方法插入新记录。
您可能会考虑的另一个选项是使用 ADO 记录集事件。除了一件非常关键的事情 - 为正在编辑、删除或插入的每条记录返回一个书签或主键之外,这些事件可能会做所有事情。
然而,第三个选项是为每条记录设置一个 DateTimeModified。然后,您几乎可以随时使用代码遍历记录集并记录尚未记录的更改。只需创建一个记录集克隆并使用记录集的 Filter 方法,如下所示:
rst.Filter "DateTimeModified > " & LastLoggedDateTime
Run Code Online (Sandbox Code Playgroud)
现在遍历过滤后的记录集并记录记录。如有必要,您可以在内存中保留原始记录集的副本(只读)并将其用于比较。看看这个帖子:比较vb6中的两个记录集
我同意没有真正简单的方法来做你想做的事情。它似乎相当复杂。
| 归档时间: |
|
| 查看次数: |
10112 次 |
| 最近记录: |