FireDac 查询字段大小不会在 sql 更改时更新

FireDac Query Field size does not update on sql change

这听起来可能很愚蠢,我可能会遗漏一些重要的东西,但就是这样。

我正在将一个旧软件从 BDE 迁移到 Firedac,我注意到一些奇怪的行为(XE6 VCL - Firedac)。

想象一下:

我们有一个具有简单 sql (SQL1) 的查询,该查询是在设计时定义的,并且检索了所有字段(3 个字段 - cod、des 和 img)。在运行时,我执行这个查询,并检查 cod 字段大小,效果很好。然后我更改 sql(SQL2) 并继续检查新的 cod 字段大小,这也有效。但是,如果我再次将 sql 更改为 SQL1 并检查 cod 字段的大小,它假定第二个查询字段大小相同。

我在一个小项目中测试过,也会出现这种情况,如下。

(我放置了 2 个按钮和一个标签来检查尺寸)

 procedure TForm1.SQL1Click(Sender: TObject);
begin
    FDQuery1.Close;
    FDQuery1.SQL.Clear;
    FDQuery1.SQL.Text:='select grefcod as cod, grefdesc as des, grefimg as img from wtv';
    FDQuery1.Open;
    sLabelFX1.Caption:=IntToStr(FDQuery1.FindField('COD').Size);
end;

procedure TForm1.SQL2Click(Sender: TObject);
begin
    FDQuery1.Close;
    FDQuery1.SQL.Clear;
    FDQuery1.SQL.Text:='select ATRBcod as cod, ATRBdes as des  from wtv2 ';
    FDQuery1.Open;
    sLabelFX1.Caption:=IntToStr(FDQuery1.FindField('COD').Size);
end;

首先调用SQL1Click,cod大小为20;

第二次调用 SQL2Click,cod 大小为 5;

最后,我再次调用 SQL1Click,cod 大小为 5 -> 错误。

编辑:SQL1 cod 的实际大小是 20 varchar,SQL2 的实际大小是 5 varchar。

这很奇怪,如果我不能更好地解释它,我深表歉意。 无论如何,如果我在设计时删除检索到的字段,问题就不存在了,我只需要改变我获取字段的方式,但由于这是一个巨大的软件,这不是我想做的事情。

此问题已通过在 FieldOptions 上将查询选项 'Update Persistent' 设置为 true 得到解决。

我真的不知道这种行为是否是故意的,但现在它起作用了。

这是使用持久字段(在设计时使用 字段编辑器 创建的字段)时的标准行为(不是说它是对的,只是它是这样工作的)。创建字段后,除非删除它们(再次使用 Field Editor),否则它们不会随着更改而更新;相反,大小只是从存储在 .DFM 中的字段定义中读取。它不是特定于 FireDAC 的;使用持久字段时,这一直是个问题。

最简单的修复方法是使用 字段编辑器,删除字段定义,然后重新添加。