绑定到ADO断开记录集的MS Access表单

问题描述

| 我似乎对这个问题一无所知。我可以将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中的两个记录集 我确实同意,没有真正简单的方法可以完成您要尝试做的事情。它似乎相当复杂。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...