绑定到ADO断开记录集的MS Access窗体
我似乎在这个问题上无能为力。我可以附加一个ADO记录集到一个表单,但我不知道如何处理更新。我不想只有UpdateBatch,我希望能够检测出为记录目的而更改的内容。任何人都可以将我指向正确的方向吗?绑定到ADO断开记录集的MS Access窗体
提供的SQL包含一个名为“ID”的自动编号的Key字段。
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
您应该能够使用的形式更新前和更新后的事件检测添加和编辑。就删除而言,您需要使用表单删除事件之一: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)
我看到芬顿先生质疑,为什么你需要断开连接的ADO记录集,而不是使用的MS Access的内置DAO结合。我知道在某些情况下ADO记录是有意义的,但我认为它们很少。绑定到诸如XML文件之类的记录资源可能就是一个例子。我个人喜欢在绑定到远程SQL Server时使用它。它非常适合在云中访问Web服务器上的SQL Server数据库。但是,您可以使用ODBC表执行相同的操作,因此除了管理DSN或ODBC表链接确实存在挑战之外,使用ADO记录集并没有真正令人信服的理由。
EDIT1:
在回答OP的有关事件赶不上质量的缺失和质量膏的担忧。删除事件会触发选定要删除的每条记录,并且在用户按下“是”后触发AfterDelConfirm事件。使用粘贴,你并不是那么幸运,因为在用户确认粘贴之后没有事件触发。一种解决方法是禁用表单中的添加,并使用其他方法插入新记录。
您可能会考虑的另一个选择是使用ADO记录集事件。看起来事件可能会做所有事情,除了一件非常重要的事情 - 返回正在编辑,删除或插入的每个记录的书签或主键。
第三个选项是为每个记录设置DateTimeModified。然后,您几乎可以随时使用代码遍历记录集并记录尚未记录的更改。只需创建一个记录集克隆和使用记录的筛选方法,像这样:
rst.Filter "DateTimeModified > " & LastLoggedDateTime
现在通过过滤重复记录和日志记录。如有必要,您可以将原始记录集的副本保留在内存中(只读)并将其用于比较。看看这篇文章:compare two record sets in vb6
我同意,没有真正简单的方法来做你想做的事情。它似乎相当复杂。
我感谢您的意见。我还想指出,这个表单将会在数据表视图中显示。 RE事件:数据表视图中设置的事件不完整,不足以记录更改。例如,用户可以删除15行,并且每行都会触发所有正确的事件,然后在“您确定”对话框后触发删除确认事件。但是,没有多行粘贴的设置和“你确定”对话框。这打破了依赖事件的整个设置。 – dmaruca 2011-04-13 13:27:13
你测试过了吗?我最近有一个用户使用查找和替换,我的审计跟踪功能记录每次记录更改。我不相信没有大规模删除和批量粘贴的可捕捉事件。 – HK1 2011-04-13 17:53:08
如果你不想要它们,为什么要启用删除? – 2011-04-18 01:53:01
你为什么觉得你需要这样做?为什么不将表单的Recordsource属性设置为适当的SQL字符串? – 2011-04-13 01:26:36