2015-04-30 71 views
0

这听起来很愚蠢,我可能会错过重要的东西,但在这里。FireDac查询字段大小不更新sql更改

我正在将旧软件从BDE迁移到Firedac,我注意到一些奇怪的行为(XE6 VCL - Firedac)。

想象一下:

我们已经有一个简单的SQL(SQL1)查询,该查询在设计时定义并具有检索到的所有领域(3场 - 鳕鱼,DES和IMG)。在运行时,我执行这个查询,并检查一个cod字段的大小,很好。然后我更改SQL(SQL2)并继续检查新的cod字段大小,这也适用。但是,如果我再次将SQL更改为SQL1并检查cod域的大小,它将假定第二个查询字段大小的大小相同。

我已经在一个小项目中对它进行了测试,这种情况也会发生,如下所示。 Fields retrieved on design time

(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。

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

回答

0

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

我真的不知道这种行为是否打算,但现在它的工作。

1

当使用持久字段(在设计时使用字段编辑器创建的字段)时,这是标准行为(不是说它是正确的,只是它是如何工作的)。一旦创建了字段,它们就不会被更新,除非它们被删除(再次使用Field Editor);相反,只是从存储在.DFM中的字段的定义中读取大小。这不是FireDAC特有的;使用持久字段时永远是个问题。

修复它的最简单方法就是使用Field Editor,删除字段定义并重新添加它。

+0

当我们完成迁移时,我们获得了很多访问冲突,大多数字段是持久性的,并且由于很多查询在运行时更新/更改,我们注意到字段大小正在变为最小大小。在小型项目中,我们手动更改并删除了持久性字段。但是在更大的软件中,这不是我们想要做的事情。正如我在其他答案中所说的,设置“更新持久性”选项似乎可以解决此问题。无论如何,我感谢您的意见,谢谢。 –