问题描述
|
我似乎对这个问题一无所知。我可以将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
解决方法
您应该可以使用窗体BeforeUpdate和AfterUpdate事件来检测添加和编辑。就Delete而言,您将需要使用以下一种形式的delete事件: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-(源代码)
我看到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
现在,遍历过滤的记录集并记录记录。如有必要,您可以在内存中保留原始记录集的副本(只读),并将其用于比较。看一下这篇文章:比较vb6中的两个记录集
我确实同意,没有真正简单的方法可以完成您要尝试做的事情。它似乎相当复杂。