2010-01-25 41 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一個多星期前,但它不是設計用於處理綁定形式編輯的數據。基本上,綁定的表單,你沒有通過其他接口具有相同的控制。這既是一個特點,也是一個缺點,取決於你想要做什麼。