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

Pascal环境下向TADO查询传递参数的正确语法

问题

在ERP系统中使用Pascal编写脚本,连接包含TIMESHEETHEADER和TIMESHEETLINES两个表的MS Access数据库时,尝试传递查询参数出现编译错误。

尝试的写法1(报错):

ADOQRY.SQL.ADD('select FIRSTNAME, LASTNAME from TIMESHEETHEADER where LASTNAME = :LASTNAME');
ADOQRY.PN('LASTNAME') := EMP_LASTNAME;

错误提示:Undeclared identifier:'PN' at 156:17

尝试的写法2(未生效):

ADOQRY.Parameters.ParamByName('EMP_LASTNAME');

使用字符串拼接可以运行,但存在SQL注入风险:

ADOQRY.SQL.ADD('select FIRSTNAME, LASTNAME from TIMESHEETHEADER where LASTNAME = ' + EMP_LASTNAME );

数据库连接代码:

ADO.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + TimeSheetFolder + 'TimeSheetRecharge.mdb';
ADO.LoginPrompt := False;
ADO.Connected := true;
ADOQry.Connection := ADO;

在访问Firebird数据库时无此问题,请问向TADO查询传递参数的正确语法是什么?


正确的TADOQuery参数传递语法

TADOQuery组件没有PN这个简写方法(这是你使用的Firebird组件特有的语法),正确的参数赋值需要通过Parameters.ParamByName方法获取参数对象后,给其对应类型的属性赋值。

完整示例代码

// 清空原有SQL语句,避免残留旧语句导致错误
ADOQRY.SQL.Clear;
// 添加带参数的查询语句
ADOQRY.SQL.Add('select FIRSTNAME, LASTNAME from TIMESHEETHEADER where LASTNAME = :LASTNAME');
// 赋值参数:根据变量类型选择对应属性,字符串用AsString更明确
ADOQRY.Parameters.ParamByName('LASTNAME').AsString := EMP_LASTNAME;
// 执行查询
ADOQRY.Open;

关键说明

  1. 参数名匹配:SQL语句中的参数名(:LASTNAME)必须和ParamByName中的参数名完全一致,不要写成变量名EMP_LASTNAME。
  2. 类型匹配:字符串类型用.AsString赋值,数字类型用.AsInteger/.AsFloat等,比直接赋值.Value更安全,能避免类型转换问题。
  3. 先清SQL:每次设置新查询前调用SQL.Clear,防止旧语句干扰新查询。

错误原因解析

  • PN是部分数据库组件(如Firebird组件)提供的简写,TADOQuery未实现该方法,因此编译报错。
  • ADOQRY.Parameters.ParamByName('EMP_LASTNAME');仅获取了参数对象但未执行赋值,且参数名与SQL中的:LASTNAME不匹配,因此无法生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 00:20:44