代码之家  ›  专栏  ›  技术社区  ›  René Nyffenegger

如何在Access中实现事务?

  •  2
  • René Nyffenegger  · 技术社区  · 15 年前

    我一直在访问表单上实现事务/Rollaback功能。

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

    在窗体的加载处理程序中,我启动事务

    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.workspaces(0)替换dbengine,但也没有效果。

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

    谢谢你给我指点方向, 雷内

    4 回复  |  直到 15 年前
        1
  •  1
  •   Philippe Grondier    15 年前

    我认为您不能在窗体上实现事务,在窗体上更新记录集(具有beforeupdate和afterupdate事件),而事务链接到执行发送到数据库的insert、update或delete命令。

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

    1. 第一个是附加一个 已将ADODB记录集断开连接到 窗体,并调用“batchupdate” 方法一旦所有更改 已经做了。虽然我还没查过 医生,我想你可以 捕获可能在以下位置发生的异常 这个阶段通过连接 对象。
    2. 第二个问题,即我们在应用程序中实现的问题,是让客户机处理原始数据的副本。在客户端,我们跟踪表单上的所有插入、删除和更新。一旦用户验证了其更改,客户机就“即时”生成一组与所做更改相对应的SQL指令,并将它们发送到数据库。然后很容易在事务中发送这些指令(每行一个事务或所有更改一个)。我们花了一段时间来调整这个解决方案,但这是值得的工作。表单验证现在是我们应用程序的每个表单上使用的一个独特功能。函数甚至允许“一个窗体到多个表”验证。
        2
  •  0
  •   Kevin Ross    15 年前

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

    您可以用几种方法来实现这一点,但我的首选方法是将详细信息加载到表单onload中,然后使用一个save按钮来触发一个子元素,将这些详细信息保存回db。我还通常设置一个公共变量bdirty,并在控件未标日期时将其更改为true,这样,如果用户试图在保存更改之前关闭表单,则可以向用户发出警告。

        3
  •  0
  •   Community VonC    7 年前

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

        4
  •  0
  •   René Nyffenegger    15 年前

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

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

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