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 的;使用持久字段时,这一直是个问题。
最简单的修复方法是使用 字段编辑器,删除字段定义,然后重新添加。
这听起来可能很愚蠢,我可能会遗漏一些重要的东西,但就是这样。
我正在将一个旧软件从 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 的;使用持久字段时,这一直是个问题。
最简单的修复方法是使用 字段编辑器,删除字段定义,然后重新添加。