一个很奇怪的问题(关于SQL查询)(60分)

  • 主题发起人 主题发起人 gunwithlove
  • 开始时间 开始时间
G

gunwithlove

Unregistered / Unconfirmed
GUEST, unregistred user!
我在用SQL查询商品信息时,遇到这样一个问题:
当我用如下程序进行模糊查询时,程序运行正常,能正确显示查询结果
(completecode:string;)
with adoquery1 do //模糊查询
begin
with sql do
begin
close;
clear;
add('select * from 承付单商品信息子表');
add('where(付款编号 like ''%'+completecode+'%'')');
add('where 付款编号=:completecode');
end; //end with sql
open;
end;
当我改为用参数查询时,(程序如下),运行时发生list index out of bounds(0)
错误,我在adoquery1的参数中设置了参数completecode(当然,也可以换成其他的变量名)
with adoquery1 do
begin
with sql do //精确查询
begin
close;
clear;
add('select * from 承付单商品信息子表');
add('where 付款编号=:completecode');
Parameters[0].DataType:=ftstring;
Parameters[0].Direction :=pdInput;
Parameters[0].Value:=completecode;
//
end; //end with sql
open;
end;
我实在不知道怎么会这样呢?请大家帮忙!谢谢!
 
adoquery的参数一直好象有点问题,所以我从来都在外边用参数,如下:
var str:string;
str:='select * from 承付单商品信息子表 where 付款编号=''%s''';
str:=format(str,[completecode]);
然后把此str加入adoquery的SQL中。
format语句可带若干参数,按顺序排再[参数1,参数2,....]中,对应前面的参数引用,
注意若是INTEGER,用如:id=%d
 
请问怎样把此str加入adoquery的SQL中呢?
 
ADOQuery1.Sql.Text := 'select * from 承付单商品信息子表 where 付款编号=''' + str + '''';
 
str:='select * from 承付单商品信息子表 where 付款编号=''%s''';
str:=format(str,[completecode]);
Text:=str;
和ADOQuery1.Sql.Text := 'select * from 承付单商品信息子表
where 付款编号=''' + str + '''';
都正确,不过我对SQL中的单引号的用法不清楚,请帮忙解释一下,好吗?我
程序中的精确查询问题出在哪儿呢?真是adoquery参数的问题吗?
 
adoquery1.sql.add(str)即可
 

>> add('where(付款编号 like ''%'+completecode+'%'')');
-->
add('where(付款编号 like '+''''+completecode+''''+')');
 
呵呵,Pacal在单引号中再加单引号是比较麻烦,一不留神就容易对不上,尤其是换行的时候。
简单地说,一般的单引号是用来引用一个字符串的,所以如果直接在单引号中加入一个
单引号会被编译器认为是单引号结束,因为确实会产生语法的歧义。为了解决这个问题,
Delphi中规定字符串中连续的两个单引号代表一个“实际的”单引号。
象s := '''';这样的表达式就是让s(String类型的变量)代表一个实际的单引号。
可以和C里面的转意符“/”对比着看待,如在C里表示一个目录“c:/temp”就要写成:"C://temp";

>>我程序中的精确查询问题出在哪儿呢?
我觉得问题好象不在上面那段程序里,我拷过来试了一下,没报错。你再看看其它地方有没有问题?

 
谢谢大家,特别感谢dq和shadowp!
原来的程序我再继续调试,先用你们的方法了。
 
后退
顶部