一个表student中存储着student的班级、姓名、成绩。
表student的结构如下:
create table student( class int, studentname varchar(30), score varchar(10))
adoquery用于查询,有dbgrid与之相连用作显示查询结果。
要实现的功能如下:
adoquery 可以按三个条件进行查询: 班级、学生姓名、成绩。既可以用多个条件查询,也可以只有某一个条件进行查询。
我在界面上放了三个checkbox,如果某个checkbox被选中,则该checkbox对应的条件就有效。
如:class 对应的checkbox和 studentname对应的checkbox都被选中,那么adoquery进行查找时就以 class 和 studentname 作为条件。问题如下,要实现以上功能,adoquery的查询语句应该怎么写呢?

解决方案 »

  1.   


    在CheckBox的单击事件中分别调用这个过程,以实现 不同方式查找。
    procedure UpdateSql;
    begin
      ADOQuery1.Close;
      ADOQuery1.Clear;
      ADOQuery1.Sql.Add('Select *');
      ADOQuery1.Sql.Add('From Student');
      ADOQuery1.Sql.Add('Where (1=1)');
      if CheckBox1.Checked then
        ADOQuery1.Sql.Add(' And (Class Like' + QuotedStr(FilterText) + ')')
      else ADOQuery1.Sql.Add('');
      if CheckBox2.Checked then
        ADOQuery1.Sql.Add(' And (StudentName Like' + QuotedStr(FilterText) + ')')
      else ADOQuery1.Sql.Add('');
      if CheckBox2.Checked then
        ADOQuery1.Sql.Add(' And (Score > ' + QuotedStr(StrToInt(FilterText)) + ')')
      else ADOQuery1.Sql.Add('');  
      ADOQuery1.Open;
    end;
      

  2.   


    var
      sql,s:string;
      i1,i2,i3,i:Integer;
    begin
      sql:='select * from student where ';
      i1:=0;
      i2:=0;
      i3:=0;
      if self.CheckBox1.Checked then
      begin
        sql:=sql+'class=:s1 and ';
        i1:=1;
      end;
      if self.CheckBox2.Checked then
      begin
        sql:=sql+'studentname=:s2 and ';
        i2:=1;
      end;
      if self.CheckBox3.Checked then
      begin
        sql:=sql+'score=:s3';
        i3:=1;
      end;
      if (i1=0) and (i2=0) and (i3=0) then
      begin
        MessageBox(application.Handle,'请选择查询条件','信息',MB_OK or MB_ICONINFORMATION);
        Exit;
      end;
      i:=Length(sql);
      s:=Copy(sql,i-4,5);
      if s=' and ' then
        sql:=Copy(sql,1,i-5);
      if i1=1 then
        self.ADOQuery1.Parameters.ParamByName('s1').Value:=self.Edit1.Text;
      if i2=1 then
        self.ADOQuery1.Parameters.ParamByName('s2').Value:=self.Edit2.Text;
      if i3=1 then
        self.ADOQuery1.Parameters.ParamByName('s3').Value:=self.Edit3.Text;
      self.ADOQuery1.Open;
      //self.Label1.Caption:=sql;
    end;
      

  3.   

    增加一个查询的button按钮,然后写该按钮的click事件:
    var
      s1,s2,s3: string;
    begin
      s1:= '';
      s2:= '';
      s3:='';
      ADOQuery1.Close;
      ADOQuery1.Clear;
      ADOQuery1.Sql.Add('Select * From Student Where (1=1)');
      if CheckBox1.Checked then
         s1 := 'and class = '+classedit1.text;
      if CheckBox2.Checked then
        s2 := ' and studentname like '+#39+studentname.text+#39;
      if CheckBox2.Checked then
        s3 := ' and score >= '+score.text;
      ADOQuery1.sql.add(s1+s2+s3);
      ADOQuery1.Open;
    end;
      

  4.   

    控制SQL语句的Where条件  
    技巧先将Where条件写成1=1  然后根据是否选中 加and就行了