Ms access 如何在Access中实现事务?

Ms access 如何在Access中实现事务?,ms-access,transactions,Ms Access,Transactions,我无法在access窗体上实现事务/回滚功能 以下是我所做工作的简要概述: 在表单的加载处理程序中,我启动事务 dbEngine.BeginTrans gInTransaction = true 然后,有一个“取消”按钮,其单击处理程序如下 dbEngine.Rollback gInTransaction = false doCmd.close acForm, "frmName" 最后,表单的卸载处理程序具有: if gInTransaction then dbEngine.Comm

我无法在access窗体上实现事务/回滚功能

以下是我所做工作的简要概述:

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

dbEngine.BeginTrans
gInTransaction = true
然后,有一个“取消”按钮,其单击处理程序如下

dbEngine.Rollback
gInTransaction = false
doCmd.close acForm, "frmName"
最后,表单的卸载处理程序具有:

if gInTransaction then
    dbEngine.CommitTrans
    gInTransaction = false ' just in case
end if
现在,关于回滚,似乎对表单没有影响。按“取消”按钮似乎不会回滚任何内容

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

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

谢谢你给我指引了正确的方向,
Rene

我同意Shahkalpesh的意见,表格的更新不属于交易的一部分。您可以通过使用未绑定表单而不是使用绑定表单来让表单执行这些操作,这样您就可以控制IO何时完成


您可以通过几种方法来实现这一点,但我更喜欢的方法是将详细信息加载到表单onload中,然后使用一个save按钮触发一个sub,将这些详细信息保存回DB。我通常还会设置一个公共变量调用bDirty,并在控件未注明日期时将其更改为true,这样,如果用户在保存更改之前尝试关闭表单,您可以警告用户,我认为您无法在表单上实现事务,在表单上对记录集进行更新(使用beforeUpdate和afterUpdate事件),当事务链接到执行发送到数据库的INSERT、UPDATE或DELETE命令时

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

  • 第一个是附加一个 已将ADODB记录集断开连接到您的 窗体,并调用“batchUpdate” 方法在完成所有更改后 已经制作好了。虽然我还没有检查 医生,我想你可以 捕获可能在以下位置发生的异常: 这一阶段是通过连接完成的 反对
  • 第二个是我们在应用程序中实现的,即让客户机处理原始数据的副本。在客户端,我们跟踪表单上的所有插入、删除和更新。一旦用户验证其更改,客户机将“动态”生成一组与所做更改相对应的SQL指令,并将它们发送到数据库。然后,在事务中发送这些指令非常容易(每行一个事务或所有更改一个事务)。我们花了一段时间来调整这个解决方案,但这是值得的。表单验证现在是一个独特的功能,用于我们的应用程序的每一种形式。该函数甚至允许“一个表单到多个表”的验证
    我在一个多星期前读过,但它不是为处理以绑定形式编辑的数据而设计的。基本上,对于绑定表单,您没有通过其他接口进行的相同控制。这既是一个特性,也是一个缺点,这取决于您试图做什么。

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


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

    在表单加载和关闭之间执行哪些DML语句(UPDATE/INSERT/DELETE)?更改是如何写入数据库的?我没有显式地编写一些dml语句,但access(或表单)通过填写(continouos)表单并附加记录来为我完成。因此,它将是上面提到的三个dml语句:update、insert和delete。在这种情况下,它不会在您使用
    dbEngine.beginters
    启动的事务下运行。使用
    dbEngine.Execute
    等执行的语句将在事务下运行,前提是在此之前调用了
    beginters
    。我认为您的解决方案描述了一种“单记录”表单,但不适用于continous表单。但在我的例子中,我必须解一个continouos形式,在你最初的问题中,我没有看到关于它是一个连续形式的部分。如果您将连续表单作为子表单,并将要执行的语句“发布”回主表单,则仍然可以。然后,您可以在需要时执行这些语句。这将是非常黑客,但会工作。除了连续形式,还有其他选择吗?