MS Access窗体绑定到ADO断开连接的记录集

时间:2011-04-12 21:18:06

标签: vba ms-access-2007 ado 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

1 个答案:

答案 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

我同意没有真正简单的方法来做你想做的事情。它看起来相当复杂。