gpt4 book ai didi

vba - MS Access 表单绑定(bind)到 ADO 断开连接的记录集

转载 作者:行者123 更新时间:2023-12-04 15:46:02 25 4
gpt4 key购买 nike

我似乎对这个问题一无所知。我可以将 ADO 记录集附加到表单,但我不确定如何处理更新。我不想只更新批处理,我希望能够检测到为记录目的而更改的内容。谁能指出我正确的方向?

提供的 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 事件来检测添加和编辑。就删除而言,您需要使用以下形式的删除事件之一: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 绑定(bind)。我确实知道在某些情况下 ADO 记录集是有意义的,但我认为它们很少而且相差甚远。绑定(bind)到诸如 XML 文件之类的记录源可能就是一个示例。我个人喜欢在绑定(bind)到远程 SQL Server 时使用它。它非常适合让 Access 与云中 Web 服务器上的 SQL Server 数据库通信。但是,您可以对 ODBC 表执行相同的操作,因此使用 ADO 记录集并没有真正令人信服的理由,除非管理 DSN 或 ODBC 表链接确实存在挑战。

编辑1:
为了回答 OP 对事件没有捕获大量删除和大量粘贴的担忧。 Delete 事件针对每条选择删除的记录触发,AfterDelConfirm 事件在用户按下"is"后触发。使用粘贴,您就没有那么幸运了,因为在用户确认粘贴后不会触发任何事件。一种解决方法是禁用表单中的添加并使用其他方法插入新记录。

您可能会考虑的另一个选项是使用 ADO 记录集事件。似乎这些事件可能会做所有事情,除了一件非常关键的事情 - 为正在编辑、删除或插入的每条记录返回一个书签或主键。

第三种选择是为每条记录设置一个 DateTimeModified。然后,您几乎可以随时使用代码来遍历记录集并记录尚未记录的更改。只需创建一个记录集克隆并使用记录集的 Filter 方法,如下所示:
rst.Filter "DateTimeModified > " & LastLoggedDateTime

现在遍历过滤的记录集并记录记录。如有必要,您可以将原始记录集的副本保留在内存中(只读)并将其用于比较。看看这个帖子: compare two record sets in vb6

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

关于vba - MS Access 表单绑定(bind)到 ADO 断开连接的记录集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5641760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com