sql 语句里有like 时改怎么写delphi程序?(100分)

N

neilw

Unregistered / Unconfirmed
GUEST, unregistred user!
想做个模糊查询:对一个数据表xx,任意指定时间范围和客户名等字段信息就可查出若干纪录
在sql 分析器里可以运行select * from xxx where date1 between '1999-06-02' and '2002-03-02'
and client like '%b%'
delphi 语句:
if adoquery1.active then adoquery1.close;

adoquery1.Parameters.ParamByName('b1').value:=datetimepicker1.DateTime;
adoquery1.Parameters.ParamByName('b2').value:=datetimepicker2.DateTime;
adoquery1.Parameters.ParamByName('aa').value:=‘%’+edit1.text+'%';
adoquery1.open;

程序运行时查询结果是空的。
如果改用只查询时间b1 b2,就可以查到数据。
数据没问题。



 
把在sql 分析器中的语句使他在程序中动态生成试试
 
详细代码如下:
with adoquery1 do
begin
close;
sql.clear;
sql.add('select * from xxx where (date1 between :Bgn and :nd) '+
' and (client like :lk)');
Parameters.ParamByName('Bgn').value:=datetimepicker1.DateTime;
Parameters.ParamByName('nd').value:=datetimepicker2.DateTime;
adoquery1.Parameters.ParamByName('lk').value:=‘%’+trim(edit1.text)+'%'
open;
end;
 
adoquery1.Parameters.ParamByName('aa').value:=quotedstr(‘%’+edit1.text+'%');
 

with adoquery1 do
begin
close;
sql.clear;
sql.add('select * from xxx where (date1 between :Bgn and :nd) '+
' and (client like :lk)');
Parameters.ParamByName('Bgn').value:=datetimepicker1.DateTime;
Parameters.ParamByName('nd').value:=datetimepicker2.DateTime;
adoquery1.Parameters.ParamByName('lk').value:=‘%’+trim(edit1.text)+'%'
open;
end;
 
你的这个问题是adoexpress的一个bug 已经有好几个人问过类似的问题我也曾遇到过不过
我已找到原因并解决
你看看下面这个贴子就明白了 最后有我解决的方法.
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1054348

解决的方法:
if adoquery1.active then adoquery1.close;
adoquery1.Parameters.ParamByName('b1').value:=datetimepicker1.DateTime;
adoquery1.Parameters.ParamByName('b2').value:=datetimepicker2.DateTime;
adoquery1.Parameters.ParamByName('aa').value:=‘%’+edit1.text+'%';
adoquery1.parameters.parambyname('aa').size:=length('‘%’+edit1.text+'%'');//加上这句就行了
adoquery1.open;

 
adoQuery1.sql.add('select * from xxx where date1 between '1999-06-02' and '2002-03-02'
and client like ''%b%'' ');
我用过类似的,没什么问题啊
 
ft1:=Edit2.Text;
ft2:=Edit2.Text;
with query1 do
begin
close;
sql.clear;
sql.add('select * from table1');
sql.add('where fieldname LIKE :ft1 or gc_mc LIKE :FT2');
Params[0].AsString:=Trim(concat(Trim(ft1),'%'));
Params[1].AsString:=Trim(Concat('%',Trim(ft2),'%'));
Open;
//我这样写一点问题也没有.
 
你把Sql的内容全部动态加入,完全拼一个Sql 不用 参数,在获取参数的值后,进行字符串的连接
例如
var s: string;
s := 'select * from a where riq='' + riq + ''' and bb like ''%' + ddd + '%'''';
Sql.add(s);
 
to :chshanghai
谢谢你的指教。
只有一个like查询时没问题了。
如果我要 aaa like :a and bbb like :b 
时好像还是不行。
麻烦再帮帮忙 
 
>>如果我要 aaa like :a and bbb like :b 
>>时好像还是不行。
好像还是不行是什么意思 是一会行一会儿不行吗
你用的是什么数据库
如用的是mssql server 用profile 监视一下提交的语句
贴出哪句提交的语句 我帮你分析一下

如果你语句没有错的话应可以 看看是不是没有用trim 去掉空格

 
to :chshanghai
select * from xxx
where
date between :d1 and :d2
aaa like :a and bbb like :b 
aaa 字段 有中文有数字
当:a 是数字时没有问题
当:a 是中文时不行,查出来是空的
bbb 字段是中文
当:b 是中文时不行,查出来是空的

用的是mssql server 用profile 监视一下提交的语句
提交语句select * from xxx
where
date between '1990-02-02' and '2005-06-06'
aaa like '%江%' and bbb like '%泽%' 
没有问题



 
你说的情况跟我猜的一模一样
不光是数字可以 其实只要是ascII字符就可以 但不能是中文字符
你最好贴出profile 中的原来完全的那句
而不是你加工后的
profile 中显示的肯定不是下面这样子的吧
>>select * from xxx where date between '1990-02-02' and '2005-06-06'
>>aaa like '%江%' and bbb like '%泽%' 
贴出profile 中它显示的哪句 和你提交的 delphi 语句 (原汁原味)

你这样子谁也没办法看出来的 按你说的什么都没有问题 哪就是撞鬼了
 
to :chshanghai
抱歉没有贴原始语句。
profiler 里:
SELECT *
FROM tblProjects
WHERE (ProjectName LIKE '%1%') AND (ProjectPayment LIKE '%未%') AND
(PrjEndingDateTime BETWEEN '1990-01-01' AND '2005-01-12') AND
(ProjectStatus LIKE '%意%')
有一条纪录
delphi 里
adoquery2:
select * from tblprojects
where
prjENDingdatetime between :datestart and :dateend
and ProjectName like :project
and projectstatus like :status
and ProjectPayment LIKE :pay
ORDER BY prjENDingdatetime DESC

begin
if adoquery2.active then adoquery2.close;
adoquery2.Parameters.ParamByName('datestart').value:=datetimepicker1.DateTime;
adoquery2.Parameters.ParamByName('dateend').value:=datetimepicker2.DateTime;
adoquery2.Parameters.ParamByName('project').Value:='%'+trim(edit1.text)+'%';
adoquery2.Parameters.ParamByName('project').size:=length('%'+trim(edit1.text)+'%');//加上这句就行了
adoquery2.Parameters.ParamByName('status').Value:='%'+trim(ComboBox1.text)+'%';
adoquery2.Parameters.ParamByName('status').size:=length('%'+trim(ComboBox1.text)+'%');//加上这句就行了
adoquery2.Parameters.ParamByName('pay').Value:='%'+trim(ComboBox2.text)+'%';
adoquery2.Parameters.ParamByName('pay').size:=length('%'+trim(ComboBox2.text)+'%');//加上这句就行了
adoquery2.open;
end;

就这些了。
 
你用的是不是 ms sql server 7.0/2000
据我所知 mssql server 的profile 工具中监视的 提交的sql 语句好像不是这样的格式
一般在7.0 中profile 中监视的到的语句应是如下的格式
我说的是 mssql server 中有一个工具叫profile 不知你上面的 sql 语句是从哪里监视到
因为这个工具可以知道 delphi 向sql server 提交时一些参数定义的情况

exec sp_executesql N'if (select count(*) from dbo.lrryk_tbl where yhmc=@P1)>0
print ''ok''', N'@P1 varchar(10)', '刘波'

 
将EDIT.TEXT去空。
这样的查询只支持单个关键词查询。
建议不要用EDIT,可以用MEMO,设置功能键加入‘%’,然后用分段取MEMO.TEXT值,
ADD SQL语句,可以实现多关键词混合查询。
 
to :chshanghai
用profile 监视两次得到如下语句
exec sp_executesql N'select * from tblprojects
where
prjENDingdatetime between @P1 and @P2
and ProjectName like @P3
and projectstatus like @P4
ORDER BY prjENDingdatetime DESC
', N'@P1 datetime,@P2 datetime,@P3 char(4),@P4 char(2)', 'Jan 1 1999 8:19AM', 'Jan 1 2200 8:19AM', '%皮%', '%%'

exec sp_executesql N'select * from tblprojects
where
prjENDingdatetime between @P1 and @P2
and ProjectName like @P3
and projectstatus like @P4
ORDER BY prjENDingdatetime DESC
', N'@P1 datetime,@P2 datetime,@P3 char(3),@P4 char(2)', 'Jan 1 1999 8:19AM', 'Jan 1 2200 8:19AM', '%1%', '%%'
第一次用中文查询没有得到纪录
第二次的到两条纪录
有一条纪录的ProjectName 是‘皮1’
另一条纪录的ProjectName 是‘123’
麻烦您给指点指点
 
你刚才说的我看不出来有什么错的
不过你的解决方法是对的

你可以把 profile 中监视的话放到 查询分析器中查询一下试试
看是否能查出记录
有什么结果别忘了告诉我

 
to :chshanghai

把 profile 中监视的话放到 查询分析器中查询
结果还是和上次一样。
 
to :chshanghai
你的贴子说加上#0解决了问题。我看不懂该怎么加呢?
我试了一个、两个、三个、四个汉字,在profile 里都可以正常传递。
没有遇到传递'江ero'的情况。
 
顶部