小M我想要在程序里实现模糊查询可是总是不行,请各位大侠帮帮改错~谢谢了~
我的数据库是Access的~
procedure TBookQuery.Button1Click(Sender: TObject);
var
  Content : string;
begin
  try
  ADOQuery1.Close;
  begin
    Content:=Edit1.Text;
    if CheckBox1.Checked then
      Content := '%'+Content +'%';
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('select * from 图书信息表 where 书名 like :书名');
  ADOQuery1.Parameters.ParamByName('书名').value := Content;
  ADOQuery1.Open;
  label4.Caption:= '共'+IntToStr(ADOQuery1.RecordCount)+'条记录';
  if ADOquery1.RecordCount=0 then
  showmessage('该书名所有的书不存在!')
  end;
  except
    MessageDlg('查询失败',mtError,[mbok],0);
end;
end;

解决方案 »

  1.   

    'select   *   from   图书信息表   where   书名   like  '+QuotedStr(Content)
    试试
    如果只取记录直接
    SELECT COUNT(*) FROM table要比你那么写效率要高得多
      

  2.   


    //干嘛不这样写procedure Tform.button1click(Sender:TObject);
    var
      str:string;
    begin
      try
        str:='select * from 图书信息表 where 书名 like ''%'+edit1.text+'%''  ';
        with adoquery do
          begin
            close;
            sql.clear;
            sql.add(str);
            open;
            lebel4.caption:='共' + inttostr(recordcount) +'条记录';
          end;
      except
        showmessage('查询失败!'); 
      end;
    end;
      

  3.   

    回复hsmserver :对不起,你的答案我看不懂,试过了也不行,也许因为我是初学者吧...
    回复fa_ge:非常感谢您的回答,确实可以实现模糊查询,但是我想要的是当 if   CheckBox1.Checked   then  执行模糊查询,我知道这对您来说非常简单,可是我改来改去都改不出满意的程序,还是想请您帮帮我~谢谢了~~~~~~~~
      

  4.   

    >>>>想要的是当   if       CheckBox1.Checked       then    执行模糊查询
    改动这个对你来说也不应该困难吧?{借用 鶴嘯九天 的代码:}
    procedure TBookQuery.Button1Click(Sender: TObject); 
    var 
      str: string; 
    begin
      if CheckBox1.Checked then 
      try
        str:='select * from 图书信息表 where 书名 like ''%'+edit1.text+'%''  ';
        with adoquery1 do
          begin
            close;
            sql.clear;
            sql.add(str);
            open;
            lebel4.caption:='共' + inttostr(recordcount) +'条记录';
          end;
      except
        showmessage('查询失败!'); 
      end;
    end;
    另外,如果你仅仅是要想知道指定条件的记录是否存在的话,用hsmserver的方法就不错。
      

  5.   

    回复lx130 :非常抱歉,我试过你发的程序,结果是不行......
    不但不能执行模糊查询,连普通查询功能都失效了......
    我真的很不明白hsmserver 说的意思......
    不知道该怎么办......
    我知道那不难,但是我怎么写都不成功,我以为我的逻辑已经对了,可是就是不行,
    一定有什么细节是我所不懂的,所以才来请教~
    请各位帮帮忙~~~~~~~~~
      

  6.   

    在楼主lx130的代码 加上begin  end;
    if checkbox1.checked then
      beign
      end;
    这样就行吧
      

  7.   

    procedure TBookQuery.Button1Click(Sender: TObject); 
    var 
      str: string; 
    begin
      if CheckBox1.Checked then 
      begin
        try
          str:='select * from 图书信息表 where 书名 like ''%'+edit1.text+'%''  ';
          with adoquery1 do
          begin
            close;
            sql.clear;
            sql.add(str);
            open;
            lebel4.caption:='共' + inttostr(recordcount) +'条记录';
          end;
        except
          showmessage('查询失败!'); 
        end;
      end;
    end;
      

  8.   

    如果上面的方法还不行,那我建议你在if CheckBox1.Checked then 的地方加上断点,然后单步跟踪,看看到底有没有进入到这个模糊查询里面去,跟踪的时候再看看Str到底是生成了什么用的命令,到数据库里面去发一下这个命令,看看这样有没有结果,这就可以知道到底是你拼出来的Sql有问题还是你的程序有问题了
      

  9.   

    回复scfanxzq: 非常遗憾,真的不行~~
    我不知道该怎么放断点....你可以教我吗?
    这个问题真的很棘手,各位大侠都没有办法帮我解决吗???????????
      

  10.   


    大家这样写SQL语句,不必书名当中出现:“%”或“'”之类的吗?
    我以前也像大家的这样写,不过,后来测试部找出了这个的BUG问题太多,
    所以换了一种写法。
      

  11.   

    wsqwang884:请问你是换了哪种写法呢?能不能请您告诉我?帮帮我改改程序好吗?谢谢了~ 
      

  12.   

    放断点:编译前,在if CheckBox1.Checked then 这一代码行的左边单击,将这一行变为红色,在RUN之后,点击BUTTON1,按F8一行行跟下去,当执行到with adoquery1 do这一代码时,看看STR的值。
      

  13.   

    出错原因是access数据库的问题,access 数据库和大部分数据库有点不一样,楼上几位的解法在sql server,
    oracle 数据库应该都可以的.
      

  14.   

    用参数的确是好办法。。我用下面的方法。你可以试验下     Close;
         SQL.Clear;
         begin
          if QueryCBox.Checked then
           begin
             if QueryRBox1.Checked  then
              begin
                SQL.Add('SELECT * FROM 商品库存 WHERE 拼音简码 LIKE :a');
                Parameters.ParamByName('a').Value := QueryEdit.Text + '%';
              end
              else
              begin
                SQL.Add('SELECT * FROM 商品库存 WHERE 拼音简码 LIKE :a');
                Parameters.ParamByName('a').Value :='%' + QueryEdit.Text + '%';
              end;
           end
           else
           begin
             if QueryRBox1.Checked  then
              begin
                SQL.Add('SELECT * FROM 商品库存 WHERE 商品名称 LIKE :a');
                Parameters.ParamByName('a').Value := QueryEdit.Text + '%';
              end
              else
              begin
                SQL.Add('SELECT * FROM 商品库存 WHERE 商品名称 LIKE :a');
                Parameters.ParamByName('a').Value :='%' + QueryEdit.Text + '%';
              end;
           end;
         end;
         Open;