Access2003,Win Xp Sp2,Delphi7,Ado连接
在Access环境的查询里可以查询到正确的结果,Sql语句一样;
动态参数的变化:Access里使用*+数据+*,Delphi为%+数据+%;
Sql语句为
SELECT *
FROM EatBill
WHERE BillID like :pBillID and DeskName like :pDeskName and (DeskID in (select DeskID from EatDeskFile where DeskClassID like :pDeskClass )) and (BillSat  in (select StaID from EatBillSat where StaID like :pBillSat ))
ORDER BY BillID;
使用Adoquery;
没有报错,奇怪的是我show了参数名和对应的值均没有错
当时查询结果确是按照
billid的查询条件和(DeskID对换了
DeskName 的查询条件和(BillSat对换了
就是明明输入的查询条件是billid 的值,查出的结果是满足(DeskID的数据;
百思不得其解!

解决方案 »

  1.   

    //打开报表
      With PubDataMode.ADOQueryTmp Do
      Begin
        Active:=False;   //读取报表查询条件
        SQL.Clear ;
        Parameters.Clear ;
        SQL.Text :=RepSerSql;
      End;  //打开报表查询条件
      With PubDataMode.ADOQueryshow Do
      Begin
        Active:=False;   //读取报表查询条件
        SQL.Clear ;
        SQL.Text :='select * from BaseRepQuery Where RepID like :pOpenRepID order By ViewOrder';
        Parameters.ParamByName('pOpenRepID').Value :=OpenRepID;
        Active :=True ;    While Not eof Do
        Begin
          PParaName := FieldByName('QueryName').Asstring;
          Case StrToInt(FieldByName('FieldClassID').Asstring) Of
          1,4,5,6:   // 字符
             PubDataMode.ADOQueryTmp.Parameters.ParamByName(PParaName).Value :='%'+FieldByName('QTextVal').AsString+'%';
          2: PubDataMode.ADOQueryTmp.Parameters.ParamByName(PParaName).Value :=FieldByName('QNumVal').Value  ;
          3: PubDataMode.ADOQueryTmp.Parameters.ParamByName(PParaName).Value :=FieldByName('QBoolVal').AsBoolean  ;
          7: PubDataMode.ADOQueryTmp.Parameters.ParamByName(PParaName).Value :=FieldByName('QDateVal').AsDateTime ;
          Else      End;
          showmessage(PubDataMode.ADOQueryTmp.Parameters.ParamByName(PParaName).Value+PubDataMode.ADOQueryTmp.Parameters.ParamByName(PParaName).Name);
          next;
        End;
      End;
      showmessage(PubDataMode.ADOQueryTmp.SQL.Text );
      PubDataMode.ADOQueryTmp.Open ;  // 查询报表这是赋值的语句;
      

  2.   

    问题解决了:
    发现问题的原因,默认的参数顺序合Sql语句中参数出现的顺序一样;parameters[i]既按0,1,2,3排列;但是系统取参数时,先取子查询的参数,我这里取参数的顺序变为了2,3,0,1。
    造成数据查询条件错乱。随意更改了顺序就可以了。
    但是我不明白为什么取参数会出错,因为我没有改代码,只调整了Sql语句的顺序。看起来这两条是完全一样的。我不知道这是Ado,Delphi,Access中那个错了。
    Access的查询是按先取子查询的参数,估计Delphi传则按出现顺序传。
    有知道原因的人请指教。SELECT * 
    FROM EatBill 
    WHERE  (DeskID in  (select DeskID from EatDeskFile where DeskClassID like :pDeskClass )) and (BillSat in (select StaID from EatBillSat where StaID like :pBillSat )) and  (BillID like :pBillID) and (DeskName like :pDeskName) 
    ORDER BY BillID