如何显式调用TIBDataSet.RefreshSQL

时间:2016-02-24 10:10:51

标签: sql database delphi

我有TIBDataSet(Embarcadero Delphi)中的记录列表,我需要找到并修改此列表中的一条记录。自打开TIBDataSet以来,其他查询和操作可能会更改底层数据库记录。因此,在进行任何更改之前和发布之前,我想将RefreshSQL称为这一条记录(以获取最新数据)。有可能这样做吗?

我不关心其他记录的状态,我确信所考虑的记录将始终更新,并且在我需要从TIBDataSet更改此记录之前将提交这些更新。

据我所知,然后在TIBDataSet向数据库发布更新后,RefreshSQL用于自动检索更改。但是我需要在进行更新之前手动(显式)检索最新状态。

1 个答案:

答案 0 :(得分:1)

尝试将TButton添加到表单并将以下代码添加到其OnClick处理程序:

procedure TForm1.btnRefreshClick(Sender: TObject);
begin
  IBQuery1.Refresh;  // or whatever your IBX dataset is called
end;

并在其上设置断点。

然后运行你的应用程序和另一个应用程序(例如它的第二个实例)并更改第二个应用程序中的一行,并将其提交回数据库。

导航到应用中已更改的行,然后单击btnRefresh并使用调试器跟踪执行情况。

您会发现TDataSet.Refresh调用其InternalRefresh,后者又调用TIBCustomDataSet.InternalRefresh。这会调用inherited InternalRefresh,它不执行任何操作,然后调用TIBCustomDataSet.InternalRefreshRow。如果你追踪到它,你会发现它构造了一个临时的IB查询来从服务器中检索当前行,这应该在你自己进行更改之前给你你想要的东西。

所以这应该做你想要的。问题是,尝试监视两个应用程序中的数据可能会完全混淆,因为它们可能处于不同的事务状态。因此,您依赖其他用户的应用程序“与您玩”交易游戏“,因此每个人都能看到一致的数据视图。