【问题标题】:FireDac Query Field size does not update on sql changeFireDac 查询字段大小不会在 sql 更改时更新
【发布时间】:2015-07-10 04:42:45
【问题描述】:

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

我正在将旧软件从 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。

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

【问题讨论】:

    标签: delphi delphi-xe6 firedac bde


    【解决方案1】:

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

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

    【讨论】:

    • 当我们完成迁移时,我们遇到了很多访问冲突,大多数字段都是持久的,并且由于很多查询在运行时更新/更改,我们注意到字段大小正在更改为最小的尺寸。在小型项目中,我们手动更改并删除了持久字段。但在更大的软件中,这不是我们想做的事情。正如我在另一个答案中所说,设置“更新持久”选项似乎可以解决这个问题。无论如何,我感谢您的意见,谢谢。
    【解决方案2】:

    已通过在 FieldOptions 上将查询选项“更新持久”设置为 true 来解决此问题。

    我真的不知道这种行为是否是有意的,但现在它可以工作了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-25
      • 1970-01-01
      • 2021-04-22
      • 2023-02-03
      相关资源
      最近更新 更多