今天看了多年前的一个帖子,发现回答不合理,有些还将其归为delphi的bug.其实主要是没有灵活应用参数。
ADOQUERY查询时,这样不行,结果不正确。
WITH ADOQUERY1 DO
BEGIN
CLOSE;SQL.CLEAR;
SQL.ADD('SELECT * FROM TABLE1 WHERE TA001=:MONTH AND TA002=:MONTH');
PARAMETERS.ParamByName('MONTH').Value :=EDIT1.TEXT;
OPEN;
END;
改成如下就可以了。
WITH ADOQUERY1 DO
BEGIN
CLOSE;SQL.CLEAR;
SQL.ADD('SELECT * FROM TABLE1 WHERE TA001=:MONTH1 AND TA002=:MONTH2');
PARAMETERS.ParamByName('MONTH1').Value :=EDIT1.TEXT;
PARAMETERS.ParamByName('MONTH2').Value :=EDIT1.TEXT;
OPEN;
END;
但对于非常多的参数的时候这样就麻烦了,还不如修改一下SQL语句
SELECT ProductId 产品编号, ProductName 产品名称, Place 生产厂, DM_ifColor 底磨色, SM_ifColor 手磨色, BL*OrderAmount 备料,
ZC*OrderAmount 制材,
BT*OrderAmount 补土,
JZ*OrderAmount 机作,
JM*OrderAmount 机磨,
SM*OrderAmount 手磨,
QA*OrderAmount 前安,
PQ*OrderAmount 喷漆,
DM*OrderAmount 底磨,
MM*OrderAmount 面磨,
HA*OrderAmount 后安,
BZ*OrderAmount 包装
FROM (select :OrderAmount OrderAmount) b,TJ_ForecastMaster
WHERE OrderId = :OrderId
上面用到的 OrderAmount就是:OrderAmount 参数的值。
ADOQUERY查询时,这样不行,结果不正确。
WITH ADOQUERY1 DO
BEGIN
CLOSE;SQL.CLEAR;
SQL.ADD('SELECT * FROM TABLE1 WHERE TA001=:MONTH AND TA002=:MONTH');
PARAMETERS.ParamByName('MONTH').Value :=EDIT1.TEXT;
OPEN;
END;
改成如下就可以了。
WITH ADOQUERY1 DO
BEGIN
CLOSE;SQL.CLEAR;
SQL.ADD('SELECT * FROM TABLE1 WHERE TA001=:MONTH1 AND TA002=:MONTH2');
PARAMETERS.ParamByName('MONTH1').Value :=EDIT1.TEXT;
PARAMETERS.ParamByName('MONTH2').Value :=EDIT1.TEXT;
OPEN;
END;
但对于非常多的参数的时候这样就麻烦了,还不如修改一下SQL语句
SELECT ProductId 产品编号, ProductName 产品名称, Place 生产厂, DM_ifColor 底磨色, SM_ifColor 手磨色, BL*OrderAmount 备料,
ZC*OrderAmount 制材,
BT*OrderAmount 补土,
JZ*OrderAmount 机作,
JM*OrderAmount 机磨,
SM*OrderAmount 手磨,
QA*OrderAmount 前安,
PQ*OrderAmount 喷漆,
DM*OrderAmount 底磨,
MM*OrderAmount 面磨,
HA*OrderAmount 后安,
BZ*OrderAmount 包装
FROM (select :OrderAmount OrderAmount) b,TJ_ForecastMaster
WHERE OrderId = :OrderId
上面用到的 OrderAmount就是:OrderAmount 参数的值。