Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 取消记录更改_Database_Delphi_Paradox - Fatal编程技术网

Database 取消记录更改

Database 取消记录更改,database,delphi,paradox,Database,Delphi,Paradox,我正在使用dbedit组件编辑记录,我有一个取消按钮,但我不确定如何才能使其恢复,以便恢复使用dbedit组件所做的所有更改 我正在考虑将记录复制到临时表中,或者在同一个表中复制记录,这样可以在保存更改时删除旧记录,或者在取消输入时删除复制的记录(保留原始记录) 我只是想知道在不创建无用的表和创建太多的过程的情况下处理这个问题的最佳方法。如果我没有弄错,对paradox表的更改只能在执行post命令后写入数据库。 如果你想取消更改,就这么做吧 TForm1.CancelButtonPresss(

我正在使用dbedit组件编辑记录,我有一个取消按钮,但我不确定如何才能使其恢复,以便恢复使用dbedit组件所做的所有更改

我正在考虑将记录复制到临时表中,或者在同一个表中复制记录,这样可以在保存更改时删除旧记录,或者在取消输入时删除复制的记录(保留原始记录)


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

如果我没有弄错,对paradox表的更改只能在执行
post
命令后写入数据库。 如果你想取消更改,就这么做吧

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

TForm1.OKButtonPress(Sender: TObject);
begin
  ParadoxTable.Post;
end;
顺便说一句,我已经很久没有使用悖论表了,所以我的记忆可能不正确,如果我错了,请随意否决这个答案。
我正在mac电脑上输入,所以现在无法检查


稍后我将查看是否可以为您提供更详细的答案。

如果我没有弄错,对paradox表的更改只能在执行
post
命令后写入数据库。 如果你想取消更改,就这么做吧

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

TForm1.OKButtonPress(Sender: TObject);
begin
  ParadoxTable.Post;
end;
顺便说一句,我已经很久没有使用悖论表了,所以我的记忆可能不正确,如果我错了,请随意否决这个答案。
我正在mac电脑上输入,所以现在无法检查


稍后,我将查看是否可以为您提供更详细的答案。

为了补充Johan的答案(使用
TDataSet.Cancel
),如果您使用
TCustomClientDataSet
,您还可以使用
RevertRecord
方法删除对当前记录的修改,前提是这些修改仍在更改日志中


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

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


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

约翰的答案是好的。如果您使用的是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的答案与事务类似,但只适用于ClientDataSet。

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的答案与事务类似,但只适用于ClientDataSet。

这对于任何(或至少大多数)TDataSet后代都是正确的。只要数据尚未过帐,您就应该能够调用.cancel将记录返回其原始状态。对于任何(或至少大多数)TDataSet子体,都应该是这样。只要数据尚未过帐,您就应该能够调用.cancel将记录返回到其原始状态。保存点为+1。在使用TDataset.+1作为保存点时,这是处理这种情况的正确方法。在使用TDataset时,这是处理这种情况的正确方法。