2012-04-13 33 views
1

我正在編輯記錄使用dbedit組件,我有一個取消按鈕,但我不確定如何使它可以使所有使用dbedit組件進行的更改都恢復。取消記錄更改

我在想複製的記錄或者到一個臨時表或重複同一個表中的記錄這將讓我刪除舊的記錄,如果保存所做的更改或刪除複製記錄(離開原來的),如果輸入取消。

我只是想知道最好的方式來處理這個問題,而不會創建無用的表,創建了太多的過程。

回答

4

如果我沒有弄錯,悖論表的更改只會在post命令後寫入數據庫。 如果要取消的變化,只是做

TForm1.CancelButtonPresss(Sender: TObject); 
begin 
    ParadoxTable.Cancel; 
end; 

TForm1.OKButtonPress(Sender: TObject); 
begin 
    ParadoxTable.Post; 
end; 

順便說一句,它是一個很長很長的時間,因爲我已經與Paradox表的工作,讓我回憶我是不正確的,請隨時否決這個答案如果我錯了。
我在Mac上輸入這個,所以我現在不能檢查它。

稍後我會向您提供更明智的答案。

+2

這對於任何(或至少大部分)TDataSet後代都應該如此。只要數據尚未發佈,您應該可以調用.cancel將記錄恢復到原始狀態。 – ESG 2012-04-13 21:04:26

3

恭維約翰的回答(用TDataSet.Cancel),如果使用TCustomClientDataSet,您還可以使用RevertRecord方法來刪除修改當前記錄,只要他們仍然在更改日誌中。

您也可以使用SavePoint設置快照並恢復到該狀態,同時取消所有修改。

+0

+1爲SavePoint。在使用TDataset時,這是處理這種情況的正確方法。 – 2012-04-13 21:52:28

3

Johan的答案對單個記錄很好。如果您正在使用SQL數據庫(Oracle,MSSql,MySql,Firebird等),則還有一種可用於多個記錄的附加方法:事務。以ADO爲例

TForm1 = class(TForm) 
    ADOConnection: TADOConnection; 
… 

    // start the transaction 
    ADOConnection.BeginTrans; 
… 

    // create records and post them 
… 

    // rollback removes the records posted 
    // since the transaction was started 
    ADOConnection.RollbackTrans; 
… or … 
    // commit completes saving the records posted 
    // since the transaction was started 
    ADOConnection.CommitTrans; 

如果您未明確啓動事務,則會在將記錄發佈到數據庫時自動啓動並提交一個事務。

François的答案類似於交易,但只適用於ClientDatasets。