我似乎对这个问题毫无头绪。我可以将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
答案 0 :(得分:4)
您应该能够使用表单BeforeUpdate和AfterUpdate事件来检测添加和编辑。对于Deletes去,你需要使用其中一个表单删除事件:BeforeDelConfirm,AfterDelConfirm或Delete。
在检测用户何时开始编辑记录时,Dirty事件也很方便。
我认为您确实需要将第一个Recordset对象设置为表单级对象,而不是将其放在Form的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时使用它。它非常适合在Web服务器上与Web上的SQL Server数据库进行Access对话。但是,您可以使用ODBC表执行相同的操作,因此除了管理DSN或ODBC表链接确实存在挑战之外,使用ADO记录集并不是一个令人信服的理由。
<强> EDIT1:强>
在回答OP对事件的担忧时,没有发现质量缺失和质量标签。删除事件将为选择删除的每条记录触发,AfterDelConfirm事件在用户按下“是”后触发。使用粘贴您没那么幸运,因为在用户确认粘贴后没有事件会触发。一种解决方法是在表单中禁用添加项,并使用其他方法插入新记录。
您可能会关注的另一个选项是使用ADO记录集事件。看起来事件可能会做除了一件非常关键的事情之外的所有事情 - 为正在编辑,删除或插入的每条记录返回书签或主键。
然而第三种选择是为每条记录设置DateTimeModified。然后,您几乎可以随时使用代码来遍历记录集并记录尚未记录的更改。只需创建一个记录集克隆并使用记录集的Filter方法,如下所示:
rst.Filter "DateTimeModified > " & LastLoggedDateTime
现在遍历已过滤的记录集并记录记录。如有必要,您可以在内存中保留原始记录集的副本(只读)并将其用于比较。看一下这篇文章:compare two record sets in vb6
我同意没有真正简单的方法来做你想做的事情。它看起来相当复杂。