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

Delphi多条件数据表查询实现求助(附代码)

Delphi多条件数据表查询实现指南

咱们一步步拆解你在Delphi中实现多条件查询遇到的问题,先从你的代码错误说起:

你的代码错误分析与修正

你当前的SQL语句拼接存在语法错误,导致查询无法正常执行,还存在SQL注入风险。我们来逐个修正:

核心错误点:

  • 字符串拼接逻辑错误:id_categ =+inttostr(id_categ) 里的加号和引号位置完全错了——你把Delphi的函数IntToStr直接写到了SQL语句里,数据库根本识别不了。正确的做法是把变量转成字符串后,和SQL语句片段拼接起来。
  • 表名疑似拼写错误:cat_degreee 最后多了一个e,建议核对数据库里的实际表名是否正确。

修正后的字符串拼接版(不推荐,仍有注入风险)

如果只是临时调试用,可以先这样改,但不建议在正式项目里用:

qr_catdegree.Close;
qr_catdegree.SQL.Clear;
// 注意引号和加号的位置,表名如果是cat_degree就改成正确的
qr_catdegree.SQL.Add('SELECT * FROM cat_degree WHERE id_categ = ' + IntToStr(id_categ) + ' AND id_degree = ' + IntToStr(id_degree));
qr_catdegree.Open;
Indice_degree := qr_catdegree.FieldByName('Indice_degree').AsInteger;
Edit15.Text := IntToStr(Indice_degree);

推荐方案:参数化查询(安全且易维护)

直接拼接字符串最大的问题是SQL注入,尤其是当参数来自用户输入时。用参数化查询不仅能彻底避免这个问题,还不用手动处理类型转换,代码更干净:

qr_catdegree.Close;
qr_catdegree.SQL.Clear;
qr_catdegree.SQL.Add('SELECT * FROM cat_degree WHERE id_categ = :pCateg AND id_degree = :pDegree');
// 绑定参数值,:pCateg和:pDegree是自定义的参数名
qr_catdegree.ParamByName('pCateg').AsInteger := id_categ;
qr_catdegree.ParamByName('pDegree').AsInteger := id_degree;
qr_catdegree.Open;
Indice_degree := qr_catdegree.FieldByName('Indice_degree').AsInteger;
Edit15.Text := IntToStr(Indice_degree);

多条件查询的通用写法(含可选条件)

你提到的SELECT data FROM table WHERE 1这类写法,核心是用WHERE 1=1作为基础框架,方便动态拼接多个可选条件——这样就不用纠结第一个条件要不要加AND,大大简化代码逻辑。

举个实际例子:假设你有多个可选查询条件(比如分类ID、等级ID、名称关键词),可以这样写:

qr_catdegree.Close;
qr_catdegree.SQL.Clear;
// 先写基础条件,后面直接加AND即可
qr_catdegree.SQL.Add('SELECT * FROM cat_degree WHERE 1=1');

// 动态添加分类ID条件:只有当id_categ有效时才加入
if id_categ > 0 then
  qr_catdegree.SQL.Add('AND id_categ = :pCateg');

// 动态添加等级ID条件
if id_degree > 0 then
  qr_catdegree.SQL.Add('AND id_degree = :pDegree');

// 动态添加名称模糊查询条件
if Trim(EditName.Text) <> '' then
  qr_catdegree.SQL.Add('AND degree_name LIKE :pName');

// 对应绑定参数
if id_categ > 0 then
  qr_catdegree.ParamByName('pCateg').AsInteger := id_categ;

if id_degree > 0 then
  qr_catdegree.ParamByName('pDegree').AsInteger := id_degree;

if Trim(EditName.Text) <> '' then
  qr_catdegree.ParamByName('pName').AsString := '%' + Trim(EditName.Text) + '%';

qr_catdegree.Open;

这种写法的优势很明显:

  • 每个条件独立判断,不用处理第一个条件的特殊情况
  • 配合参数化查询,完全杜绝SQL注入风险
  • 代码清晰易维护,新增条件只需加一段判断和参数绑定即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:38:43