这听起来很愚蠢,我可能会错过重要的东西,但在这里。FireDac查询字段大小不更新sql更改
我正在将旧软件从BDE迁移到Firedac,我注意到一些奇怪的行为(XE6 VCL - Firedac)。
想象一下:
我们已经有一个简单的SQL(SQL1)查询,该查询在设计时定义并具有检索到的所有领域(3场 - 鳕鱼,DES和IMG)。在运行时,我执行这个查询,并检查一个cod字段的大小,很好。然后我更改SQL(SQL2)并继续检查新的cod字段大小,这也适用。但是,如果我再次将SQL更改为SQL1并检查cod域的大小,它将假定第二个查询字段大小的大小相同。
我已经在一个小项目中对它进行了测试,这种情况也会发生,如下所示。
(I放置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,鳕大小为20;
第二我打电话SQL2Click,鳕鱼大小是5;
最后,我再次调用SQL1Click和cod大小是5 - >错误。
编辑:SQL1 cod的实际大小是20 varchar,而SQL2的实际大小是5 varchar。
它很奇怪,如果我不能更好地解释它,很抱歉。 无论如何,如果我在设计时删除检索到的字段,问题就不存在了,我只需要改变字段的获取方式,但由于这是一个巨大的软件,我不想这么做。
当我们完成迁移时,我们获得了很多访问冲突,大多数字段是持久性的,并且由于很多查询在运行时更新/更改,我们注意到字段大小正在变为最小大小。在小型项目中,我们手动更改并删除了持久性字段。但是在更大的软件中,这不是我们想要做的事情。正如我在其他答案中所说的,设置“更新持久性”选项似乎可以解决此问题。无论如何,我感谢您的意见,谢谢。 –