如何在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
相关产品推荐
相关产品推荐

