locate为什么不能实现模糊查询?
例如数据集中有一个姓名字段,其值有
....
管理员
管理
....
事件代码如下:
procedure TForm1.Button4Click(Sender: TObject);
begin
if not ADOQuery2.Locate('姓名',edit1.Text,[lopartialKey]) then
showmessage('No record found');
end;
当在edit1里输入"管"或"管理"时,能定位到那条记录,当输入"理"或"员"时,却找不到记录,请问如何在数据集里实现模糊查询(注意:只要求在数据集中实现模糊查询,不要去表里实现模糊查询)
问题点数:0、回复次数:18Top
1 楼flayyao(姚俊)回复于 2004-08-01 19:10:35 得分 0
不是locate不支持,是因为delphi不支持中文,我被这个问题也弄的头疼死了,强烈建议borland公司修复此bug,而且我已经写信向borland公司反映过,但是没有回复Top
2 楼kyong()回复于 2004-08-01 19:16:19 得分 0
但是,为什么在edit1里输入"管"或"管理"时,能定位到那条记录呢?说明delphi能支持中文呀Top
3 楼yjbnew(伟大的光荣的正确的ASP千岁千岁千千岁)回复于 2004-08-01 19:34:45 得分 0
用filter (过滤) 就可以Top
4 楼linzhengqun(风。我回来了)回复于 2004-08-01 19:50:50 得分 0
用SQL语句不是更好吗,速度也快一些:
ADOQuery2.sql.add('select * from yourTable where 姓名=''%'+Edit1.text+'%''');Top
5 楼kyong()回复于 2004-08-01 20:03:31 得分 0
你这样写是从表里搜索,我要求的是从已经返回到本地的记录集里搜索
另外,请问如何使用filter,结合我的例子,Top
6 楼leeon868(Delphi无神论者)回复于 2004-08-01 20:34:44 得分 0
如果是一个合格的开发人员,
首先,就不要把你的字段之类的关键字定义为中文。这个是个最起码的前提。即便用中文也要弄成常量。
其次,如果工具不提供这些,就不要怪工具。那只能怪你自己使用不当。同样一把斧子,别人可以砍柴,你为什么不能砍?那背面砍的?斧子的利刃不用,偏偏用背面。delphi的优势不去用,偏偏用劣势。Top
7 楼lionlsl(林)回复于 2004-08-01 20:35:22 得分 0
去掉Edit1.text两边的空:trim(Edit1.text);Top
8 楼SuQingQuan(边城浪子)回复于 2004-08-01 21:23:20 得分 0
leeon868(Delphi无神论者) ,说得有道理啊。其实Delphi只是我们手头上的一种工具,你正握反握都不重要,最主要的是能砍到材(财)。Top
9 楼getit911(Windows转Linux中)回复于 2004-08-01 21:28:35 得分 0
locate和filter只能做类似:管*这样的查询,不支持完全的模糊查询。
中文列更便于维护,而且现在的数据库都支持非英文列。Top
10 楼kyong()回复于 2004-08-01 22:45:10 得分 0
leeon868(Delphi无神论者),你好,你的道理很对,但对这个问题,你说错了,你再看看代码
procedure TForm1.Button4Click(Sender: TObject);
begin
if not ADOQuery2.Locate('姓名',edit1.Text,[lopartialKey]) then
showmessage('No record found');
end;
问题不在字段名为汉字"姓名",而是在于在字段里各记录存的是汉字(难道你表里存的都是英文吗?),假设将字段名改为name,该字段里有:
管理
管理员
管理处
等等记录
procedure TForm1.Button4Click(Sender: TObject);
begin
if not ADOQuery2.Locate('name,edit1.Text,[lopartialKey]) then
showmessage('No record found');
end;
此时,如果在edit1里输入"管"或"管理",就能找到需要的记录,如果在edit1里输入"理"或"员"就找不到需要的记录.Top
11 楼linzhengqun(风。我回来了)回复于 2004-08-01 23:05:32 得分 0
还是坚持我的观点,用SQL语句,最强大的查询方式Top
12 楼anbangs(大邦)回复于 2004-08-02 01:59:38 得分 0
我想楼主不用SQL语句,可能是考虑到读取速度吧Top
13 楼hanly2008(郁闷人)回复于 2004-08-02 07:52:48 得分 0
if not ADOQuery2.Locate('姓名',edit1.Text,[lopartialKey]) then
showmessage('No record found');
将lopartialKey去掉,改成:
if not ADOQuery2.Locate('姓名',edit1.Text,[]) then
showmessage('No record found');Top
14 楼kyong()回复于 2004-08-02 12:15:57 得分 0
是呀,为了减轻服务器负担,同时为了速度.
那些数据已经返回到记录集,没必要再到去服务器去找了,是不是?
hanly2008(郁闷人),你的方法不行呀,它只能做到精确查找.Top
15 楼Delphi78()回复于 2004-08-02 12:36:25 得分 0
你的‘姓名’字段是否为关键字?loPartialKey选项在我的印象中针对的是关键字。
locate是用来定位的,不是模糊查找,你到底要实现的是定位还是模糊查找?
还有,用Filter可以实现你要的模糊查找--前提是你要的是模糊查找而不是定位Top
16 楼viaboy(平凡)回复于 2004-08-02 12:38:04 得分 0
用SQL语句吧,比较通用。Top
17 楼kyong()回复于 2004-08-02 23:42:31 得分 0
是呀,我要的是模糊查询,而不是定位,用locate无法实现,用filter如何实现呢?Top
18 楼Delphi78()回复于 2004-08-04 09:02:02 得分 0
Filter:='姓名>='+''''+trim(edit1.Text)+''''+chr(0)+' and 姓名<='+trim(edit1.Text)+chr(255)+'''';
Top




