FireDac查询字段大小不会更新sql change

时间:2015-04-30 12:59:12

标签: delphi delphi-xe6 firedac bde

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

我将旧软件从BDE迁移到Firedac,我发现了一些奇怪的行为(XE6 VCL - Firedac)。

想象一下:

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

我在一个小项目中测试了它,这也发生了,如下所示。 Fields retrieved on design time

(我放置了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。

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

通过在FieldOptions上将Query选项'Update Persistent'设置为true来解决此问题。

我真的不知道这种行为是否有意,但现在它正在发挥作用。