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

如何在FireDAC查询中插入查询字符串并为文本添加单引号

解决FireDAC中SQL查询的字符串安全拼接问题

你的代码现在面临两个核心问题:一是直接拼接控件文本没加单引号会导致SQL语法错误,二是存在极高的SQL注入风险——这可是数据库操作里的严重安全隐患,必须重视。

下面给你两种解决方案,优先推荐第一种参数化查询,这是行业标准的安全做法:

方案1:使用参数化查询(强烈推荐)

参数化查询会让FireDAC自动处理字符串的单引号包裹、特殊字符转义,同时彻底杜绝SQL注入。写法如下:

procedure TForm_Main.CB_Nom_Specialite_DemandeChange(Sender: TObject);
begin
  DM.FDQ_Find.SQL.Clear;
  // 用:XXX定义参数占位符,SQL结构和参数值分离
  DM.FDQ_Find.SQL.Text := 'select ID_Specialite from Specialite where Nom_Specialite = :NomSpecialite';
  
  // 给参数赋值,FireDAC会自动处理所有字符串转义工作
  DM.FDQ_Find.ParamByName('NomSpecialite').AsString := CB_Nom_Specialite_Demande.Text;
  
  DM.FDQ_Find.Open;
  
  ID_Specialite := 0;
  // 新增判断:如果查询结果不为空再取值,避免无记录时报错
  if not DM.FDQ_Find.IsEmpty then
    ID_Specialite := DM.FDQ_Find.FieldByName('ID_Specialite').AsInteger;
end;

为什么推荐这个方案?

  • 自动处理单引号:比如控件文本是O'Neil这种带单引号的内容,FireDAC会自动转义成O''Neil,不会触发SQL语法错误
  • 完全避免SQL注入:哪怕有人在控件里输入恶意内容(比如' OR 1=1 --),参数化查询会把它当成普通字符串处理,不会执行恶意SQL逻辑
  • 代码可读性更强:SQL结构和参数值分离,后期维护更方便

方案2:手动使用QuotedStr函数包裹字符串(仅临时场景使用)

如果出于某些原因必须手动拼接字符串,可以用Delphi内置的QuotedStr函数,它会自动给字符串加上单引号,同时转义字符串内部的单引号:

procedure TForm_Main.CB_Nom_Specialite_DemandeChange(Sender: TObject);
begin
  DM.FDQ_Find.SQL.Clear;
  // 用QuotedStr包裹控件文本,自动添加单引号并转义内部特殊字符
  DM.FDQ_Find.SQL.Text := 'select ID_Specialite from Specialite where Nom_Specialite = ' + QuotedStr(CB_Nom_Specialite_Demande.Text);
  
  DM.FDQ_Find.Open;
  
  ID_Specialite := 0;
  if not DM.FDQ_Find.IsEmpty then
    ID_Specialite := DM.FDQ_Find.FieldByName('ID_Specialite').AsInteger;
end;

⚠️ 注意:这个方案虽然解决了单引号的语法问题,但仍然不如参数化查询安全,尤其是在处理用户输入时,参数化始终是最优选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 15:02:34