我在表单中放置了一个Edit控件,在输入相关的信息后,
能数据库中找到相关的所有记录。当然,edit控件不是针对一个字段。
我本来有一个想法的,就是把一条记录的各个字段值连接成一个字符串,
然后用like来写SQL语句。但是就是不会写啊,各位大哥,多多指教,最好给我代码。
能数据库中找到相关的所有记录。当然,edit控件不是针对一个字段。
我本来有一个想法的,就是把一条记录的各个字段值连接成一个字符串,
然后用like来写SQL语句。但是就是不会写啊,各位大哥,多多指教,最好给我代码。
query1.sql.clear;
query1.sql.add(
'select * from tableName where (field1 like :para1) or (field2 like :para1)');
query1.parameters.parabyname('para1').value:='%'+edit1.text+'%';
query1.open;
temp:='select * from tab1 where f1 like '+#39+Edit1.text+'%'+#39;
query.sql.add(temp);
如果想对任意字段查询需要一个combobox把字段名称列出来,让用户选,把f1改为combobox1.text.
begin
close;
sql.clear; sql.add('select * from ajjbqk where ajwzname like :zz'); parambyname('zz').asstring:=edit3.text+'%';
open;
if recordcount>0 then form_ajjbqk.showmodal
else showmessage('没有你要查询的记录');
end;
end;
fyje(冬原) 按你的方法当我有三十几个字段时怎么办呢?我所谓的模糊查询是指,随便输入什么东西,只要与记录中有几个字相符就能够找了来。如果说方法的话,我原先的那种才是最好的,
但是不好实现。
同时各种数据库所使用的 “引号”不太一样,如Access日期型用#XXX#来分界,
要实现通用查询,需要对字段类型进行判断,然后构造条件,同时最好使用标准SQL。
tablename:表名
fieldname:字段名;
fieldtype:相应字段类型;
fieldvalue:要查询字段值;
}
find(tablename:string;fieldname:string;fieldtype:integer;fieldvalue:string):dataset;
var
adoquery:tadoquery;
begin
adoquery:=tadoquery.create(self);
adoquery.connection:=datamodule1.adoconnection1;
adoquery.sql.clear;
adoquery.sql.add('select * from '+tablename+' where '+fieldname+' like % :pfieldvalue %');
case filedtype of
1://代表整形
begin
adoquery.parameters.parameterbyname('pfieldvalue').value:=strtoint(fieldvalue);
end;
2://代表字符串形
begin
adoquery.parameters.parameterbyname('pfieldvalue').value:=fieldvalue;
end;
3://代表日期
adoquery.parameters.parameterbyname('pfieldvalue').value:=strtodate(fieldvalue);
.//自己定义吧.
.
.
end;
try
adoquery.open;
adoquery.connection:=nil;
result:=adoquery.dataset;
adoquery.free;
except
messagebox(handle,'数据查询出错!!','提示',mb_iconerror);
adoquery.free;
result:=nil;
end;
end;
access 中日期使用#外非数值使用单引号
close;
sql.Clear;
sql.Add('select * from busquery where 路线 like:road');
parameters.ParamByName('road').Value:='%'+edit1.text+'%';
open;
end;
如下代码:
{说明:
tablename:表名
fieldnamelist:字段名列表;
fieldtypelist:相应字段类型列表;
{1代表整形,2代表字符型,3代表日期,4...,5....}
fieldvalue:要查询字段值;
}
find(tablename:tstringlist;fieldnamelist:tstringlist;fieldtypelist:tstringlist;fieldvalue:string):dataset;
var
adoquery:tadoquery;
i:integer;
begin
adoquery:=tadoquery.create(self);
adoquery.connection:=datamodule1.adoconnection1;
adoquery.sql.clear;
adoquery.sql.add('select * from '+tablename+' where ')
for i:=0 to fieldnamelist.count-1 do
begin
if adoquery.sql.text<>'' then
adoquery.sql.add(' or');//or加在此处以防止搞乱顺序.
adoquery.sql.add(fieldnamelist[i]+ like %');
case strtoint(filedtype) of
1://代表整形
begin
adoquery.sql.add(fieldnamelist[i]+' like %'+fieldvalue+'%');
end;
2://代表字符串形
begin
adoquery.sql.add(fieldnamelist[i]+'like %'+''''+fieldvalue+''''+'%');
end;
.......
end;
end;
end;
try
adoquery.open;
adoquery.connection:=nil;
result:=adoquery.dataset;
adoquery.free;
except
messagebox(handle,'数据查询出错!!','提示',mb_iconerror);
adoquery.free;
result:=nil;
end;
end;
select * from table where field1+field2+field3+.... like '''%'+Edit.text+'%''';
注意:1.field1,field2...为char\varchar,必须有值,即不能为Null,
这很关键,当在Access中好像没有这个问题而且字段间的连接用'&',
但在SQL SERVER中没好像会出错了,不能为空并用'+'相连接。
也可以写DataSet的onFilterRecord事件