2010-01-25 45 views
2

我卡在访问表单上实现事务/回滚功能。如何在Access中实现交易?

这里是我做了什么的精简概要:

在窗体的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替换用到dbengine(0),没有任何效果。

所以,问题是:我怎么在Access实现事务?

感谢任何指针到正确的方向, 刘若英

+0

在窗体加载和关闭之间执行什么DML语句(UPDATE/INSERT/DELETE)?如何将更改写入数据库? – shahkalpesh 2010-01-25 05:43:58

+0

我没有*明确*写一些dml语句,但是通过填写(连续)表单和追加记录,访问(或表单)为我完成。所以,这将是所有三个提到的dml语句:更新,插入和删除。 – 2010-01-25 06:29:14

+0

在这种情况下,它不会在使用'dbEngine.BeginTrans'启动的事务下运行。如果您在此之前调用了'BeginTrans',则使用'dbEngine.Execute'等执行的语句将在事务下运行。 – shahkalpesh 2010-01-25 07:04:58

回答

0

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

你可以这样做的一些方法,但我的首选方法是细节加载到形式的onload,然后有一个保存按钮触发,节省了这些细节回DB子。我也通常设置一个公共变量调用bDirty,并将其更改为真时,如果有一天的控制日期如此,你可以警告用户,如果他们尝试在保存更改之前关闭表单

+0

我认为你的解决方案描述了一种可能的'单一记录'形式,但不适用于连续形式。但就我而言,我必须解决它的连续形式。 – 2010-01-25 10:08:35

+0

我没有看到它在原始问题中是连续的形式。如果您将连续表单作为子表单,并将“执行”语句“发布”回主表单,这仍然是可能的。你可以在你想要的时候执行这些语句。这将是非常hacky,但会工作。除连续形式外,还有其他选择吗? – 2010-01-25 10:40:51

+0

看到我的编辑为连续的形式 – 2010-01-25 13:15:29

1

我不认为你可以在一个表单,在记录集上进行更新(使用beforeUpdate和afterUpdate事件),而事务链接到执行发送到数据库的INSERT,UPDATE或DELETE命令。

编辑:如果你的想法是能够进行管理,一旦某地连续形式进行的所有更改,你有2个不同的解决方案:

  1. 第一个是到 断开ADODB记录附加到您的 形式,并称之为“BATCHUPDATE” 方法,一旦所有的修改都 完成的。虽然我还没有检查 的医生,我想你就可以 捕捉异常,可以在 通过连接 对象发生的这个阶段。
  2. 第二个,这是我们在我们的应用程序中实现的一个,是让客户端在原始数据的副本上工作。在客户端,我们跟踪在表单上进行的所有插入,删除和更新。一旦用户验证其更改,客户端就会根据所做更改生成一堆SQL指令,并将它们发送到数据库。在交易中发送这些指令非常简单(每行一个事务或所有更改都是一个事务)。我们花了我们一段时间来微调这个解决方案,但这是值得的。表单验证现在是我们应用程序的每种形式中使用的一项独特功能。该功能甚至允许“一个表格到多个表格”的验证。
0

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