TClientDataSet - 如何 'cancel' 从文件加载?

TClientDataSet - how to 'cancel' loadfromfile?

我有一个以 .cds 格式存储数据的 TClientDataSet。

假设我这样做了:

clientDataSet1.loadFromFile('myclient.cds');

在我这样做之后,是否有办法恢复加载并将组件置于调用此方法之前的状态,以便我可以添加/删除与 .cds 文件无关的字段?

我想我需要使用 'clearData' 选项,但我只能在设计时这样做,我没有找到在 运行 时间内调用它的方法。

如您所知,SaveToFileLoadFromFile 的存在主要是为了支持 CDS 的 "Briefcase" 操作模式,您可以在其中处理数据库记录的本地副本 在与记录的源数据库断开连接时,将更改保存在本地 然后在重新连接后应用它们。保存的文件包括更改缓存 CDS,这样你就可以做这样的事情:

 clientDataSet1.LoadFromFile('myclient.cds');
 clientDataSet1.UndoLastChange;

这会将 CDS 的记录恢复到它们之前的状态 在调用 SaveToFile 之前保存到 CDS 的最后更改。

然而,这并不是你所要求的,在我看来这就是如何恢复 将 CDS 恢复到调用 LoadFromFile 之前的任何状态,然后 点它可能包含完全不同的数据。

如果你想恢复之前的状态,你可以这样做,提供 您在调用 LoadFromFile.

之前采取措施保存它

最简单的是

clientDataSet1.SaveToFile('myclient.prv');
clientDataSet1.loadFromFile('myclient.cds');

if ReloadPreviousVersion then
  clientDataSet1.loadFromFile('myclient.prv');

或者,如果您想避免保存到磁盘

var
  PrvData : OleVariant;
[...]
  PrvData := clientDataSet1.Data;
  clientDataSet1.loadFromFile('myclient.cds');

  if ReloadPreviousVersion then
    clientDataSet1.Data := PrvData;

(或者您可以从内存流中保存 to/load)。

顺便说一句,我不知道你是否熟悉它,但是 CDS 有一个 SavePoint property,这对于回溯和撤消更改非常方便;不幸的是,SavePoints 不允许回溯过去的操作,如 LoadFromFileApplyUpdates,因为这些会清除 CDS 的更改缓存。

关于您的 'clearData' 查询,如果您只想清除 CDS 的数据,只需执行

clientDataSet1.EmptyDataSet;