我正在使用Embarcadero Delphi XE2和Firebird DB,使用TIBDatabase
,TIBTransaction
和TIBTable
组件。在表单中,用户可以编辑数据库表的数据,并在需要时提交/回滚更改。 当他关闭表单时,我想问他是否要提交/回滚挂起的更改。
但只有等待更改。否则我不想打扰/迷惑用户。 如何确定?我尝试了Active
和InTransaction
交易的属性,但它们始终是真的。如果它有用,请注意我在事务上将AllowAutoStart
设置为true。谢谢!
答案 0 :(得分:3)
您可以自己跟踪待处理的更新:在表格AfterDelete
和AfterPost
事件中打开标记;在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
枚举该事务的所有表,并询问这些表是否有挂起的更改。如果没有 - 那么默默地提交并退出。如果有人 - 提示用户。