确定TIBTransaction是否有挂起的更改

时间:2012-10-09 07:34:55

标签: delphi transactions delphi-xe2 firebird

我正在使用Embarcadero Delphi XE2和Firebird DB,使用TIBDatabaseTIBTransactionTIBTable组件。在表单中,用户可以编辑数据库表的数据,并在需要时提交/回滚更改。 当他关闭表单时,我想问他是否要提交/回滚挂起的更改。

但只有等待更改。否则我不想打扰/迷惑用户。 如何确定?我尝试了ActiveInTransaction交易的属性,但它们始终是真的。如果它有用,请注意我在事务上将AllowAutoStart设置为true。谢谢!

2 个答案:

答案 0 :(得分:3)

您可以自己跟踪待处理的更新:在表格AfterDeleteAfterPost事件中打开标记;在AfterTransactionEnd中将其关闭:

// IBTable1.AfterDelete
procedure TForm1.IBTable1AfterDelete(DataSet: TDataSet);
begin
  FPendingUpdates := True;
end;

// IBTable1.AfterPost
procedure TForm1.IBTable1AfterPost(DataSet: TDataSet);
begin
  FPendingUpdates := True;
end;

// IBTable1.AfterTransactionEnd
procedure TForm1.IBTable1AfterTransactionEnd(Sender: TObject);
begin
  FPendingUpdates := False;
end;

// Form1.OnCloseQuery
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
  DlgResult: TModalResult;
begin
  CanClose := False;

  if FPendingUpdates then
    DlgResult := MessageDlg('Commit pending updates before closing?', mtConfirmation,
      [mbYes, mbNo, mbCancel], 0, mbCancel)
  else
    DlgResult := mrNo;

  case DlgResult of
    mrYes:
      IBTransaction1.Commit;
    mrNo:
      IBTransaction1.Rollback;
    mrCancel:
      Exit;
  end;

  CanClose := True;
end;

答案 1 :(得分:1)

http://docwiki.embarcadero.com/Libraries/XE3/en/IBDatabase.TIBTransaction.SQLObjects

枚举该事务的所有表,并询问这些表是否有挂起的更改。如果没有 - 那么默默地提交并退出。如果有人 - 提示用户。