如何在Access中实现事务?

时间:2010-01-25 05:39:22

标签: ms-access transactions

我无法在访问表单上实现事务/ rollaback功能。

以下是我所做的简要说明:

在表单的Load处理程序中,我启动事务

dbEngine.BeginTrans
gInTransaction = true

然后,有一个“取消”按钮,其Click处理程序就像

dbEngine.Rollback
gInTransaction = false
doCmd.close acForm, "frmName"

最后,表单的卸载处理程序具有:

if gInTransaction then
    dbEngine.CommitTrans
    gInTransaction = false ' just in case
end if

现在,关于回滚的表单似乎没有任何影响。按“取消”按钮似乎不会回滚任何内容。

我也尝试用dbEngine.workspaces(0)替换dbEngine,但也没有效果。

所以,问题是:如何在Access中实现事务?

感谢任何指向正确方向的指针, 雷

4 个答案:

答案 0 :(得分:1)

我认为您不能在表单上实现事务,其中对记录集进行更新(使用beforeUpdate和afterUpdate事件),而事务链接到执行发送到数据库的INSERT,UPDATE或DELETE命令。

编辑:如果您的想法是能够同时管理对连续表单所做的所有更改,那么您有两种不同的解决方案:

  1. 第一个是附上一个 将ADODB记录集断开连接到您的 表单,并调用'batchUpdate' 方法一旦你所有的变化都有 已经成型。虽然我没有检查 医生,我猜你能做到的 捕获可能发生的异常 这个阶段通过连接 对象。
  2. 第二个是我们在应用程序中实现的,是让客户端处理原始数据的副本。在客户端,我们会跟踪表单上的所有插入,删除和更新。一旦用户验证其更改,客户端就会“动态”生成与所做更改相对应的一堆SQL指令,并将它们发送到数据库。然后在事务中发送这些指令非常容易(每行一个事务或所有更改一个事务)。我们花了一段时间来微调这个解决方案,但这是值得的。表格验证现在是我们各种形式的应用程序使用的独特功能。该功能甚至允许“一个表格到多个表格”验证。

答案 1 :(得分:0)

我同意Shahkalpesh表格的更新不会成为交易的一部分。您可以通过使用未绑定的表单而不是使用绑定表单来获取表单,以便您可以控制IO何时完成。

您可以通过几种方式执行此操作,但我首选的方法是将详细信息加载到表单onload中,然后使用一个保存按钮来触发将这些详细信息保存回数据库的sub。我还通常设置一个公共变量调用bDirty并在控件未注明日期时将其更改为true,这样您可以在保存更改之前尝试关闭表单时警告用户

答案 2 :(得分:0)

posted a code example for how to use transactions in Access一个多星期前,但它并非设计用于处理以绑定形式编辑的数据。基本上,对于绑定表单,您没有通过其他接口执行的控制。这既是一个功能也是一个缺点,取决于你想要做什么。

答案 3 :(得分:0)

研究这些交易,我发现这个链接很有希望:

http://support.microsoft.com/kb/248011

然而,它似乎还有一些其他问题。