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

Delphi FireDAC将列名作为参数传递如何避免被自动包裹单引号

FireDAC动态替换列名的解决方案

你遇到的问题是SQL参数化查询的固有特性导致的:参数化设计仅用于传递查询值,所有参数内容都会被FireDAC自动转义并包裹单引号,从根源避免SQL注入,因此无法直接用参数传递列名、表名这类SQL标识符。

FireDAC提供了专门的**宏(Macro)**功能用来动态替换SQL中的标识符、SQL片段,不会自动添加值引号,用法如下:

步骤1:修改SQL语法,用&前缀声明宏占位符

将原来的:column_name参数替换为宏占位符&column_name:

select f1, f2
from t1
where id = :par1
and &column_name = :value_name

步骤2:代码中赋值宏

FireDAC的宏提供专门的AsIdentifier属性,会自动适配不同数据库的标识符转义规则(比如MySQL自动加反引号、SQL Server自动加方括号),避免关键字、特殊字符导致的语法错误:

// 给宏赋值列名
FDQuery1.MacroByName('column_name').AsIdentifier := 'department_name';
// 原有正常参数正常赋值即可
FDQuery1.ParamByName('par1').AsInteger := 123;
FDQuery1.ParamByName('value_name').AsString := 'production';

FDQuery1.Open;

注意事项

如果列名来自用户输入的可编辑内容,建议提前做白名单校验,仅允许传入预设的合法列名,进一步规避SQL注入风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:06:03