我在表单中放置了一个Edit控件,在输入相关的信息后,
能数据库中找到相关的所有记录。当然,edit控件不是针对一个字段。
我本来有一个想法的,就是把一条记录的各个字段值连接成一个字符串,
然后用like来写SQL语句。但是就是不会写啊,各位大哥,多多指教,最好给我代码。

解决方案 »

  1.   

    query1.close;
    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;
      

  2.   

    如果只对一个字段查询
    temp:='select * from tab1 where f1 like '+#39+Edit1.text+'%'+#39;
    query.sql.add(temp);
    如果想对任意字段查询需要一个combobox把字段名称列出来,让用户选,把f1改为combobox1.text.
      

  3.   

    procedure Tform_chax.BitBtn4Click(Sender: TObject);begin   with dm.Q_ajjbqk do
       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;
      

  4.   

    唉,,不是很妥呀,
     fyje(冬原) 按你的方法当我有三十几个字段时怎么办呢?我所谓的模糊查询是指,随便输入什么东西,只要与记录中有几个字相符就能够找了来。如果说方法的话,我原先的那种才是最好的,
    但是不好实现。
      

  5.   

    不好实现对于不同的类型条件不一样,如数值型 、日期型,在多数DB中不用加引号,而字符串型多数要加引号来表示,还有Memo/text/image类型,
    同时各种数据库所使用的 “引号”不太一样,如Access日期型用#XXX#来分界,
    要实现通用查询,需要对字段类型进行判断,然后构造条件,同时最好使用标准SQL。
      

  6.   

    {说明: 
     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;
      

  7.   

    你要先打开表,取回字段和类型,比如生成如下格式fieldName1=fieldAttr1, ................fieldNameN=fieldAttrN..然后根据字段类型和名称在动态创建 SQL 语句即可。sqlserver中非数值全部用单引号
    access 中日期使用#外非数值使用单引号
      

  8.   

    with adoquery1 do begin
    close;
    sql.Clear;
    sql.Add('select * from busquery where 路线 like:road');
    parameters.ParamByName('road').Value:='%'+edit1.text+'%';
    open;
    end;
      

  9.   

    把上面的那段代码改为全字段也可以:
    如下代码:
    {说明: 
     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;
      
      

  10.   

    对于SQLServer数据库:
    select * from table where field1+field2+field3+.... like '''%'+Edit.text+'%''';
    注意:1.field1,field2...为char\varchar,必须有值,即不能为Null,
      

  11.   

    呵呵,我做出来了,很高兴啊,,最后一位朋友说的是正确的,特别是最后一句话即字段必须有值不能为空。
    这很关键,当在Access中好像没有这个问题而且字段间的连接用'&',
    但在SQL SERVER中没好像会出错了,不能为空并用'+'相连接。
      

  12.   

    %XXX%
    也可以写DataSet的onFilterRecord事件