You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重建FireDAC?Delphi12.2自定义TFDDataSet本地化列名更新报错

Delphi 12.2 FireDAC本地化列名匹配问题解决方法

我在Delphi 12.2中实现自定义TFDDataSet组件,其余功能正常,但使用SQL Server本地化语言列名时,DBGrid自动更新触发错误:

COUNT field incorrect or syntax error

排查后发现问题出在FireDAC.Stan.Param.pas的TFDParams.FindParam函数:

function TFDParams.FindParam(const AValue: String): TFDParam;
var
  i: Integer;
begin
  for i := 0 to Count - 1 do begin
    Result := Items[i];
    if {$IFDEF FireDAC_NOLOCALE_META} CompareText {$ELSE} AnsiCompareText {$ENDIF}
       (Result.Name, AValue) = 0 then
      Exit;
  end;
  Result := nil;
end;

当FieldName(派生自TFDParams.Name)为'Nameö',AValue(派生自TFDParams.Markers)为'NameÖ'时,CompareText()比较失败,仅使用AnsiCompareText()可解决问题。注释Firedac.inc中的FireDAC_NOLOCALE_META指令无效,需重建相关DCU或BPL包,操作步骤如下:

  • 步骤1:定位FireDAC源码项目文件
    Delphi企业版自带的FireDAC源码通常位于C:\Program Files (x86)\Embarcadero\Studio\23.0\source\data\firedac目录,找到FireDAC.groupproj组项目文件,或对应功能的.dpk包文件(如FireDAC.Stan.dpk等基础包)。

  • 步骤2:修改函数逻辑(跳过宏依赖)
    打开FireDAC.Stan.Param.pas,直接修改FindParam函数,强制使用AnsiCompareText,无需依赖编译宏:

    function TFDParams.FindParam(const AValue: String): TFDParam;
    var
      i: Integer;
    begin
      for i := 0 to Count - 1 do begin
        Result := Items[i];
        if AnsiCompareText(Result.Name, AValue) = 0 then
          Exit;
      end;
      Result := nil;
    end;
    

    若坚持使用宏控制,需打开包项目的编译选项(Project > Options > Delphi Compiler > Conditional defines),确认FireDAC_NOLOCALE_META未被添加到编译宏列表中。

  • 步骤3:重建FireDAC包

    1. 打开FireDAC.groupproj,右键选择Build All,或逐个编译Firedac290*.dpk系列包(注意区分Win32/Win64平台)。
    2. 编译完成后,新生成的DCU和BPL文件会覆盖原目录下的文件(默认路径如C:\Program Files (x86)\Embarcadero\Studio\23.0\lib\win32\release),需确保有管理员权限完成写入。
  • 步骤4:验证修复效果
    重启Delphi,重新编译自定义TFDDataSet项目,测试SQL Server本地化列名的DBGrid自动更新功能,确认错误不再触发。

内容的提问来源于stack exchange,提问作者BxOO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 17:16:02