首页 > 解决方案 > Delphi FireDAC:如何刷新缓存中的数据

问题描述

我需要刷新缓存更新中的 TFDQuery 中的数据。为了简化我的问题,假设我的 MsACCESS 数据库由我必须加入的 2 个表组成。

LABTEST(id_test, dat_test, id_client, sample_typ)
SAMPLEType(id, SampleName)

在 Delphi 应用程序中,我使用 TFDConnection 和 1 个 TFDQuery(在缓存更新中),在其中我加入了 2 个表,其中的脚本是:

"SELECT T.id_test, T.dat_test, T.id_client, T.sample_typ, S.SampleName
FROM   LABTEST  T
left JOIN    SAMPLEType  S ON  T.sample_typ = S.id"

在我的应用程序中,我还使用 DBGrid 来显示查询结果。和一个用于编辑字段“sample_typ”的按钮,如下所示:

qr.Edit;
qr.FieldByName('sample_typ').AsString:=ce2.text;
qr.Post;

“sample_typ”字段的版本工作正常,但相应的“sampleName”字段在更新后没有改变(在网格中)。事实上它并没有刷新!问题出在这里:如果我刷新查询,则会引发异常:“无法刷新数据集。必须提交或取消缓存更新,并且在刷新之前终止批处理模式”

如果我提交更新,数据将被发送到数据库,我不希望这样,我需要将数据保存在缓存中直到操作结束。另外,如果我从缓存中取出,数据将在网格中刷新,但会在 qr.post 之后发送到数据库,我不希望这样。

我需要刷新缓存中的数据。解决办法是什么 ?

提前致谢。

标签: delphicachingrefreshfiredac

解决方案


问题归结为这样一个事实,即您没有告诉您的 UI 对这两个字段有任何依赖关系 - 它显然不知道如何在不重新提交的情况下自行进行连接,所以如果您不想发送更新和重新加载你会遇到问题。

目前尚不清楚您要做什么,但这两个想法可能会对您有所帮助。

如果您不打算编辑 SAMPLEType 表 (S) 中的字段,则将该表中的值加载到查找表中。您可以将其加载到 TFDMemTable 中。您可以使用从查询加载的适配器。然后,您的 UI 控件可以根据在本地 TFDMemTable 中查找的值显示该值。取决于 UI 控件,这可能是“LookupField”或类似的。

您还可以使用适配器将主要数据存储在 TFDMemTable 中 - 您可以指定不同的 TFDCommands 来读取整个记录集、刷新记录、更新、插入和删除记录。TFDCommands 可以作用于多个表,用于像这样连接的记录集。这将在您发布时自动为您刷新个人记录。


推荐阅读