这可能听起来很愚蠢,我可能会遗漏一些重要的东西,但现在就这样了。
我将旧软件从BDE迁移到Firedac,我发现了一些奇怪的行为(XE6 VCL - Firedac)。
想象一下:
我们有一个查询,它有一个简单的sql(SQL1),这个查询是在设计时定义的,并且检索了所有字段(3个字段 - cod,des和img)。在运行时,我执行此查询,并检查鳕鱼字段大小,效果很好。然后我更改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 size是20;
其次我调用SQL2Click,cod size是5;
最后,我再次调用SQL1Click并且鳕鱼大小为5 - >错误。
编辑:SQL1 cod的实际大小为20 varchar,SQL2的实际大小为5 varchar。
很奇怪,如果我无法解释它,那就很抱歉。 无论如何,如果我在设计时删除检索到的字段,问题不存在,我只需要改变我获取字段的方式,但由于这是一个巨大的软件,这不是我想做的事情
答案 0 :(得分:1)
使用持久字段(在设计时使用字段编辑器创建的字段)时,这是标准行为(不是说它是对的,只是说它是如何工作的) 。创建字段后,除非将其删除(再次使用字段编辑器),否则它们不会随更改一起更新;相反,只需从存储在.DFM中的字段定义中读取大小。它不是特定于FireDAC的;使用持久字段时,它永远是一个问题。
最简单的解决方法是使用字段编辑器,删除字段定义,然后重新添加。
答案 1 :(得分:0)
通过在FieldOptions上将Query选项'Update Persistent'设置为true来解决此问题。
我真的不知道这种行为是否有意,但现在它正在发挥作用。