2011-04-12 46 views
3

我似乎在这个问题上无能为力。我可以附加一个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 
+1

你为什么觉得你需要这样做?为什么不将表单的Recordsource属性设置为适当的SQL字符串? – 2011-04-13 01:26:36

回答

4

您应该能够使用的形式更新前和更新后的事件检测添加和编辑。就删除而言,您需要使用表单删除事件之一: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

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

+0

我感谢您的意见。我还想指出,这个表单将会在数据表视图中显示。 RE事件:数据表视图中设置的事件不完整,不足以记录更改。例如,用户可以删除15行,并且每行都会触发所有正确的事件,然后在“您确定”对话框后触发删除确认事件。但是,没有多行粘贴的设置和“你确定”对话框。这打破了依赖事件的整个设置。 – dmaruca 2011-04-13 13:27:13

+0

你测试过了吗?我最近有一个用户使用查找和替换,我的审计跟踪功能记录每次记录更改。我不相信没有大规模删除和批量粘贴的可捕捉事件。 – HK1 2011-04-13 17:53:08

+0

如果你不想要它们,为什么要启用删除? – 2011-04-18 01:53:01