1

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

但前提是有待处理的更改。否则我不想打扰/混淆用户。我怎样才能确定它?我尝试了Active交易InTransaction的属性,但它们总是正确的。如果它有用,请注意我AllowAutoStart在事务中设置为 true。谢谢!

4

2 回答 2

4

您可以自己跟踪未决更新:在您的表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;
于 2012-10-09T08:36:28.267 回答
2

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

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

于 2012-10-09T08:39:14.807 回答