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

