我正在编辑记录使用dbedit组件,我有一个取消按钮,但我不确定如何使它可以使所有使用dbedit组件进行的更改都恢复。取消记录更改
我在想复制的记录或者到一个临时表或重复同一个表中的记录这将让我删除旧的记录,如果保存所做的更改或删除复制记录(离开原来的),如果输入取消。
我只是想知道最好的方式来处理这个问题,而不会创建无用的表,创建了太多的过程。
我正在编辑记录使用dbedit组件,我有一个取消按钮,但我不确定如何使它可以使所有使用dbedit组件进行的更改都恢复。取消记录更改
我在想复制的记录或者到一个临时表或重复同一个表中的记录这将让我删除旧的记录,如果保存所做的更改或删除复制记录(离开原来的),如果输入取消。
我只是想知道最好的方式来处理这个问题,而不会创建无用的表,创建了太多的过程。
如果我没有弄错,悖论表的更改只会在post
命令后写入数据库。 如果要取消的变化,只是做
TForm1.CancelButtonPresss(Sender: TObject);
begin
ParadoxTable.Cancel;
end;
TForm1.OKButtonPress(Sender: TObject);
begin
ParadoxTable.Post;
end;
顺便说一句,它是一个很长很长的时间,因为我已经与Paradox表的工作,让我回忆我是不正确的,请随时否决这个答案如果我错了。
我在Mac上输入这个,所以我现在不能检查它。
稍后我会向您提供更明智的答案。
恭维约翰的回答(用TDataSet.Cancel
),如果使用TCustomClientDataSet
,您还可以使用RevertRecord
方法来删除修改当前记录,只要他们仍然在更改日志中。
您也可以使用SavePoint
设置快照并恢复到该状态,同时取消所有修改。
+1为SavePoint。在使用TDataset时,这是处理这种情况的正确方法。 – 2012-04-13 21:52:28
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。
这对于任何(或至少大部分)TDataSet后代都应该如此。只要数据尚未发布,您应该可以调用.cancel将记录恢复到原始状态。 – ESG 2012-04-13 21:04:26