起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 544|回复: 20

变量绑定问题

[复制链接]
发表于 2009-10-26 10:44:20 | 显示全部楼层 |阅读模式
在in子句中如何绑定变量?
下面的写法都不行。

var
  MSUsers: TStrings;
  lquery:Tquery;
  i:integer;
  v_fiter:string;
begin
  i:=0;
  MSUsers:=TStringList.Create;
  lquery:=Tquery.Create(self);
  try
    lQuery.ConnectionString := 'DATABASEURL=Biz:\SYSTEM\SYSTEM.DATABASE';
    lQuery.CommandText :='select fid from tperson';
    lQuery.open;
    lQuery.First;
    while not lQuery.Eof  do
    begin
            MSUsers.Add(lQuery.FieldByName('fid').AsString);
      i:=i+1;
      if i>100 then
        break;
      lQuery.Next;
    end;
    v_fiter:='';
    for i:=0 to MSUsers.Count-1 do
    if i=0 then
      v_fiter:= ''''+MSUsers+''''
    else
      v_fiter:=''''+MSUsers+''''+','+  v_fiter;
    lQuery.Close;
    lQuery.CommandText :='select etelphone1 from tperson where fid in(:v_fid)';
    lQuery.Params.ParamByName('v_fid').AsString:= v_fiter;//''''+MSUsers[0]+'''';
    lQuery.Open;
    DataSource1.DataSet:=lquery;
  finally
    MSUsers.Free;
    MSUsers:=nil;
  end;
end;
回复

使用道具 举报

发表于 2009-10-26 10:57:14 | 显示全部楼层
那就直接拼sql语句吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-10-26 10:58:55 | 显示全部楼层
如果直接拼sql,这样的sql太多了。每次提交到数据库都要重新硬解析一次,浪费了大量地数据库时间,对性能影响较大。
回复 支持 反对

使用道具 举报

发表于 2009-10-26 11:02:46 | 显示全部楼层
没有那么大的性能影响。况且您已经试验了,这个in用的有问题了。
回复 支持 反对

使用道具 举报

发表于 2009-10-26 11:12:29 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-10-26 16:01:02 | 显示全部楼层
楼上的和拼 sql 是一样的 。这样只能查询一条语句。
lQuery.CommandText :='select etelphone1 from tperson where fid in(:v_fid)';
lQuery.Params.ParamByName('v_fid').AsString:= MSUsers[0];

有些功能绑定后,比没有绑定时快2~3秒。
回复 支持 反对

使用道具 举报

发表于 2009-10-26 16:03:43 | 显示全部楼层
上面给的链接已经说了,不支持IN用法。要使用就只能用like形式。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-10-26 16:22:18 | 显示全部楼层
不会用like,那个例子没看明白,能不能简单写个?
回复 支持 反对

使用道具 举报

发表于 2009-10-26 16:25:32 | 显示全部楼层
Biz:\GROUPPRODUCTSTAT\ParamsTargets.ParamGroup\TargetList.Param like '%|'+ FTARGETDEFCODE + '|%'

这里是一个参数,参数值是 多个字符串组成,FTARGETDEFCODE 是字段。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-10-26 16:33:14 | 显示全部楼层
我的意思是,我不知道参数是怎么传进去。
lQuery1.CommandText :='select fid from tperson where '+v_fiter+' like ''|''fid''|''';
这个写法不对。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-15 04:37 , Processed in 0.046711 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表