Query 模糊查询问题

angelwork 2010-08-09 12:55:41

procedure TForm2.Button1Click(Sender: TObject);
var
sos:string;
begin

ADOTable1.Close;
ADOQuery1.sql.Clear;
if edit1.Text='' then
ADOQuery1.sql.Add('select * from 回款数据')
else
begin
ADOQuery1.sql.Add(('select * from 回款数据 where :ziduan like :zhi'));
ADOQuery1.Parameters.ParamByName('ziduan').Value:=ComboBox1.Text;
ADOQuery1.Parameters.ParamByName('zhi').Value:=('%'+edit1.Text+'%');

end;


实现功能:动态赋值所查询的字段名称和模糊取值.

错误:代码可正常运行,查询后为空白

注明:如果写死字段名称('select * from 回款数据 where 城市 like :zhi)则一切功能正常查询

疑问:是不是like之前sql 语句中不支持变量操作?还是改语句不支持多变量操作?还是什么错误?

先谢谢高手了!
...全文
407 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿三 2010-08-10
  • 打赏
  • 举报
回复
好像字段不能用参数传递
goodhj 2010-08-10
  • 打赏
  • 举报
回复
认真看回复,OK?弄懂变量和参数的区别
ADOQuery1.sql.Add('select * from 回款数据 where '+ComboBox1.Text(变量,字段名)+' like :zhi(参数,值)');
ADOQuery1.Parameters.ParamByName('zhi').Value:=('%'+edit1.Text+'%');
angelwork 2010-08-10
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 goodhj 的回复:]

认真看回复,OK?弄懂变量和参数的区别
ADOQuery1.sql.Add('select * from 回款数据 where '+ComboBox1.Text(变量,字段名)+' like :zhi(参数,值)');
ADOQuery1.Parameters.ParamByName('zhi').Value:=('%'+edit1.Text+'%');
[/Quote]

我是期望解决like 左右都使用变量的, 真不知道跟你墨迹半天, 你再想什么...

就你上面这样变相的方法,至少有100条我都可以写出来, 但我现在想解决和求证like 左右都使用变量.

不懂就别乱说了.... 还区别呢..
angelwork 2010-08-09
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 goodhj 的回复:]
高手请看这段代码, 我吧后面的参数写死了, 动态选择添加字段名,, 运行也没问题.


那是因为你Combobox的值正好是'哈尔滨',语句执行的就是

select * from 回款数据 where '哈尔滨' like '%哈尔滨'%'//当然会有返回

你把Combobox的值换成不是哈尔滨的试下呢?
[/Quote]


combobox中的值,是利用函数添加的所有字段名称, 不会存在哈尔滨的现象哦!

所以说,

Parameters.ParamByName('zhi').Value:=('%'+edit1.Text+'%');


利用上面的方法自动赋值引号是不对的... 问题不在这里.

还请高手帮忙继续分析,谢谢.

yanshangfei 2010-08-09
  • 打赏
  • 举报
回复
你用的什么数据库Acess吗
如果是Sql语句有问题
ADOQuery1.sql.Add(('select * from 回款数据 where :ziduan like :zhi'));
ADOQuery1.Parameters.ParamByName('ziduan').Value:=ComboBox1.Text;
ADOQuery1.Parameters.ParamByName('zhi').Value:='''+edit1.Text+'%'';
ADOQuery1.open;

sqlstr:= 'select * from 回款数据 where '+combobox1.text+ ' like ''+edit1.text+'%'';
//你可以单步执行看看这个sqlstr的值
正确的值应该是:select * from 回款数据 where 地址 like '哈尔滨%'

ADOQuery1.sql.Add(sqlstr);
ADOQuery1.open;
goodhj 2010-08-09
  • 打赏
  • 举报
回复
高手请看这段代码, 我吧后面的参数写死了, 动态选择添加字段名,, 运行也没问题.


那是因为你Combobox的值正好是'哈尔滨',语句执行的就是

select * from 回款数据 where '哈尔滨' like '%哈尔滨'%'//当然会有返回

你把Combobox的值换成不是哈尔滨的试下呢?
goodhj 2010-08-09
  • 打赏
  • 举报
回复
这个有什么不明白的啊?你用参数传进去的字符串值在执行的时候自动会加上单引号,变量的就不会

ADOQuery1.sql.Add('select * from 回款数据 where :ziduan like :zhi');
ADOQuery1.Parameters.ParamByName('ziduan').Value:=ComboBox1.Text;
ADOQuery1.Parameters.ParamByName('zhi').Value:=('%'+edit1.Text+'%');
假如你ComboBox1.Text的值为XX,edit1.Text的值为OO

这种写法最终执行的SQL语句成了
select * from 回款数据 where 'XX' like '%OO%'//不是字段值比较,而是一个字符串逻辑条件

ADOQuery1.sql.Add('select * from 回款数据 where '+ComboBox1.Text+' like :zhi'));
ADOQuery1.Parameters.ParamByName('zhi').Value:=('%'+edit1.Text+'%');

这种写法最终执行的SQL语句成了
select * from 回款数据 where XX like '%OO%'//结果当然是你想要的,是字段值比较




angelwork 2010-08-09
  • 打赏
  • 举报
回复

procedure TForm2.Button1Click(Sender: TObject);
var
sos:string;
begin

ADOTable1.Close;
ADOQuery1.sql.Clear;
if edit1.Text='' then
ADOQuery1.sql.Add('select * from 回款数据')
else
begin
{ ADOQuery1.sql.Add(('select * from 回款数据 where ')+ComboBox1.Text+(' like :zhi'));
//ADOQuery1.Parameters.ParamByName('ziduan').Value:=ComboBox1.Text;
ADOQuery1.Parameters.ParamByName('zhi').Value:='%'+edit1.Text+'%';}
ADOQuery1.SQL.Add(('select * from 回款数据 where :zhi like %哈尔滨%'));
ADOQuery1.Parameters.ParamByName('zhi').Value:=ComboBox1.Text;

end;
ShowMessage(ADOQuery1.sql.Text);
ADOQuery1.Open;

end;


高手请看这段代码, 我吧后面的参数写死了, 动态选择添加字段名,, 运行也没问题.

现在最大的问题在于, 不能在sql一条语句里,用2个变量.. 这是为什么呢?. 谢谢!
angelwork 2010-08-09
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 goodhj 的回复:]

5楼的写法是对的,代码理解你可以加注释嘛

ADOQuery1.sql.Add(('select * from 回款数据 where :ziduan like :zhi'));
ADOQuery1.Parameters.ParamByName('ziduan').Value:=ComboBox1.Text;
ADOQuery1.Parameters.ParamByName('zhi……
[/Quote]

select * from 回款数据 where 'XX' like '%OO%'

这个形成的sql 有问题吗?...


procedure TForm2.Button1Click(Sender: TObject);
var
sos:string;
begin

ADOTable1.Close;
ADOQuery1.sql.Clear;
if edit1.Text='' then
ADOQuery1.sql.Add('select * from 回款数据')
else
begin
ADOQuery1.sql.Add(('select * from 回款数据 where ')+ComboBox1.Text+(' like :zhi'));
//ADOQuery1.Parameters.ParamByName('ziduan').Value:=ComboBox1.Text;
ADOQuery1.Parameters.ParamByName('zhi').Value:='%'+edit1.Text+'%';

end;
ADOQuery1.Open;

end;


这个代码我是知道, 也可以运行,就跟我主题描述的一样,只要取消一行变量,就没任何问题...但是我觉得这样的书写不是很易懂,而且我很想搞清楚,到底是为什么, 不能用2个变量!请高手指教!

goodhj 2010-08-09
  • 打赏
  • 举报
回复
5楼的写法是对的,代码理解你可以加注释嘛

ADOQuery1.sql.Add(('select * from 回款数据 where :ziduan like :zhi'));
ADOQuery1.Parameters.ParamByName('ziduan').Value:=ComboBox1.Text;
ADOQuery1.Parameters.ParamByName('zhi').Value:=('%'+edit1.Text+'%');
假如你ComboBox1.Text的值为XX,edit1.Text的值为OO
这种写法最终执行的SQL语句成了

select * from 回款数据 where 'XX' like '%OO%'
结果可想而知
haitao 2010-08-09
  • 打赏
  • 举报
回复
参数方式只能用于值,不能用于字段名吧
angelwork 2010-08-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 goodhj 的回复:]

在Open前
Showmessage(ADOQuery1.Sql.Text);
看看执行的语句是什么就明白了
[/Quote]

这个方法昨天就测试过了, 但是只能显示变量名,不能显示具体值. 这个比较头疼.

谢谢兄弟!
angelwork 2010-08-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 rainy_mimi 的回复:]

Delphi(Pascal) code

procedure TForm2.Button1Click(Sender: TObject);
var
sos:string;
begin

ADOTable1.Close;
ADOQuery1.sql.Clear;
if edit1.Text='' then
ADOQuery1.sql.Add('select * from 回款数据'……
[/Quote]

其他方式实现没有问题,个人也会操作, 之所以这样写代码, 只为了代码好理解,干净.

哎. 头疼..不过,谢谢兄弟!
angelwork 2010-08-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bdmh 的回复:]

Delphi(Pascal) code
ADOQuery1.Parameters.ParamByName('zhi').Value:=QuotedStr('%'+edit1.Text+'%'));
[/Quote]

谢谢兄弟, 该参数不需要加引号了,.... 加与不加同理.
kye_jufei 2010-08-09
  • 打赏
  • 举报
回复
試試這個:

procedure TForm2.Button1Click(Sender: TObject);
var
sos:string;
begin
ADOTable1.Close;
ADOQuery1.sql.Clear;
if edit1.Text='' then
ADOQuery1.sql.Add('select * from 回款数据')
else
begin
ADOQuery1.sql.Add(('select * from 回款数据 where :ziduan like :zhi'));
ADOQuery1.Parameters.ParamByName('ziduan').Value:=ComboBox1.Text;
ADOQuery1.Parameters.ParamByName('zhi').Value:=QuotedStr('%'+edit1.Text+'%'));
ADOQuery1.open;
end;
angelwork 2010-08-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lyhoo163 的回复:]

行不用参数调好SQL语句后,再加入参数。
[/Quote]

谢谢哥们, sql 格式没问题, 现在只是ziduan参数引发的不能正式显示.
angelwork 2010-08-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wade520 的回复:]

ADOQuery1.open?
[/Quote]

这个操作有问题?... ...
酣酣 2010-08-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 goodhj 的回复:]
在Open前
Showmessage(ADOQuery1.Sql.Text);
看看执行的语句是什么就明白了
[/Quote]
顶楼上!
Rainy_mimi 2010-08-09
  • 打赏
  • 举报
回复

procedure TForm2.Button1Click(Sender: TObject);
var
sos:string;
begin

ADOTable1.Close;
ADOQuery1.sql.Clear;
if edit1.Text='' then
ADOQuery1.sql.Add('select * from 回款数据')
else
begin
sos:='SELECT * FROM 回款数据 WHERE '+ QuotedStr(ComboBox1.Text)+' LIKE :zhi';
ADOQuery1.sql.Add(sos);
ADOQuery1.Parameters.ParamByName('zhi').Value:=('%'+edit1.Text+'%');
end;

goodhj 2010-08-09
  • 打赏
  • 举报
回复
在Open前
Showmessage(ADOQuery1.Sql.Text);
看看执行的语句是什么就明白了
加载更多回复(6)

2,496

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧