SQL查询参数个数也动态
软件世界
问题的提出:SQL查询是数据库编程时经常用到的一项技术,按参数值是否可变化,查询可分为静态查询和动态查询。本人使用Delphi开发数据库,数据库控件使用ADO Query,然后在其SQL属性中添加select 语句。静态查询如select * from table where field=value,这里的value是固定值,在写程序时就给出;动态查询就是查询的参数值可动态变化,如select * from table where field=:para,ADOQuery.Parameters[0].value=Edit1.text,参数值可由外部输入,实现查询值的变化,达到动态查询的目的。本人在编程时为提高查询效率而使用select in方法,具体语句为:select * from table where xh in (value1,value2,…,val uen),in中的参数是变化的,个数也是变化的。用动态查询方法只能解决参数值变化的问题,但不能解决参数个数动态变化的问题。
问题的解决:经分析,既然ADOQuery的查询语句是字符串,可以利用字符串的特点,添加参数个数。具体实现如下:ADOQuery.sql.add(”select * from table where field in (:para”+Int toStr(i ,这样在运行时,就被解释成se lect * from table where field1=:parai,参数变成parai而不是para。仅仅这样做还不够的,因为当只有一个参数时,上述语句是正确的,但当有多个参数时,参数之间还要用“,”隔开。用循环实现如下:
//j表示实际参数个数,可以动态变化
ADOQuery.close;
ADOQuery.sql.clear;
//首先将select语句前半部分select * from table where field in (:para0确定下来
ADOQuery.sql.add(“select * from table where field in (:para”+IntToStr(0));
//如果参数个数多于2个的话,添加“,”和参数“:Parai”
for i:=0 to j-1 do
ADOQuery.SQL.Add(‘,:para’+IntToStr(i));
//为SQL语句末尾加上右括号,保证SQL语句的完整性。
ADOQuery.SQL.Add(‘)’);
//下面只要利用ADOQuery.Paramerts[i].value为所有参数赋值即可,这里略去不写。
通过上述方法,就实现了SQL语句中参数个数和参数值的双重动态变化。本程序在Delphi7.0+Windows98+Access2000中调试通过。