取消记录更改

Posted

技术标签:

【中文标题】取消记录更改【英文标题】:Cancelling Record Changes 【发布时间】:2012-04-13 20:51:23 【问题描述】:

我正在使用 dbedit 组件编辑记录,我有一个取消按钮,但我不确定如何制作它,因此使用 dbedit 组件所做的所有更改都将被还原。

我正在考虑将记录复制到临时表或在同一个表中复制记录取消。

我只是想知道在不创建无用表和创建太多过程的情况下处理此问题的最佳方法。

【问题讨论】:

【参考方案1】:

如果我没记错的话,对 paradox 表的更改只会在 post 命令之后写入数据库。 如果您想取消更改,只需执行此操作

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

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

顺便说一句,自从我使用悖论表以来已经很长时间了,所以我的记忆是不正确的,如果我弄错了,请随时投票否决这个答案。 我是在mac上输入的,所以现在无法查看。

稍后我会看看是否可以为您提供更明智的答案。

【讨论】:

对于任何(或至少大多数)TDataSet 后代都应该是这样。只要数据还没有发布,您应该可以调用 .cancel 将记录恢复到原始状态。【参考方案2】:

为了称赞 Johan 的回答(使用 TDataSet.Cancel),如果您使用 TCustomClientDataSet,您也可以使用 RevertRecord 方法删除对当前记录的修改,前提是它们仍在更改日志中。

您还可以使用SavePoint 设置快照并恢复到该状态,同时取消所有修改。

【讨论】:

+1 用于保存点。这是使用 TDataset 时处理这种情况的正确方法。【参考方案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。

【讨论】:

以上是关于取消记录更改的主要内容,如果未能解决你的问题,请参考以下文章

如何在设置记录数据时屏蔽 Extjs 网格并在设置后取消屏蔽?

使用 Sammy.js 取消路由而不影响历史

更新取消事件之前的 MS Access 不适用于未绑定的组合框

取消路由更改请求 (React/Redux/Axios)

UISearchController 更改“取消”按钮标题

如何“取消还原”已还原的 Git 提交?