我想做一个查询模快能通用的查询,最好给我源码谢谢:[email protected]

解决方案 »

  1.   

    unit DBQueryClass;interfaceuses
      Windows,DB,Classes,ADODB,SysUtils,DBTables,Forms;  Type
      //定义操作符
      Idf_Single=(IfLike,IfIn,IfIsNull,IfIsNotNull,IfEven);
      Idf_Both=(IfBetween,IfScope);
      type
      //多条件值
      TWhereOne=Record
         Str_Con:String;
         Str_FldName:String;
         Str_FldValue:String;
         If_Idf:Idf_Single;
      end;
      TArrayTWhereOne=array of TWhereOne;  TWhereTwo=Record
         Str_Con:String;
         Str_FldName:String;
         Str_FldValueB:String;
         Str_FldValueE:String;
         If_Idf:Idf_Both;
      end;
      TArrayTWhereTwo=array of TWhereTwo;
      //*-------------------------------------------------------------
      //*以下是公共函数
      //*-------------------------------------------------------------
      Function  Func_AddQuotedStr(SL_String:TStringList):String;  Function  Func_SingleWhere(Str_FldName:String;Str_FldValue:String;If_Idf:Idf_Single):String;Overload;
      Function  Func_SingleWhere(Str_FldName:String;Str_FldValueB,Str_FldValueE:String;If_Idf:Idf_Both):String;Overload;  Function  Func_WholeWhere(WhereOne:TArrayTWhereOne):String;Overload;
      Function  Func_WholeWhere(WhereTwo:TArrayTWhereTwo):String;Overload;  Function  Func_ExecuteQuery(ADOQuy:TADOQuery;Str_SQL:String):Integer;Overload;
      Function  Func_ExecuteQuery(BDEQuy:TQuery;Str_SQL:String):Integer;Overload;
      //*-------------------------------------------------------------
      //*以下是公共过程
      //*-------------------------------------------------------------  //*-------------------------------------------------------------
      //*以下是类的定义
      //*-------------------------------------------------------------implementation
    Function  Func_AddQuotedStr(SL_String:TStringList):String;
    var
       Int_i:Integer;
       Str_Tmp:String;
    begin
       Str_Tmp:='';
       For Int_i:=0 to SL_String.Count-1 do
       begin
           if Str_Tmp<>'' then
               Str_Tmp:=Str_Tmp+','+QuotedStr(SL_String.Strings[Int_i])
           else
               Str_Tmp:=QuotedStr(SL_String.Strings[Int_i]);
       end;
       Result:=Str_Tmp;
    end;
    Function  Func_SingleWhere(Str_FldName:String;Str_FldValue:String;If_Idf:Idf_Single):String;Overload;
    var
       Str_Tmp:String;
    begin
       Str_Tmp:='';
       Case If_Idf of
       IfLike:        //like条件
       begin
           Str_Tmp:=Str_FldName+' Like '+QuotedStr(Str_FldValue);
       end;
       IfIn:          //In条件
       begin
           Str_Tmp:=Str_FldName+' In '+'('+Str_FldValue+')';
       end;
       IfIsNull:      //Is Null条件
       begin
           Str_Tmp:=Str_FldName+' Is Null ';
       end;
       IfIsNotNull:   //Is Not Null条件
       begin
           Str_Tmp:=Str_FldName+' Is Not Null ';
       end;
       IfEven:        //=条件
       begin
          Str_Tmp:=Str_FldName+' = '+QuotedStr(Str_FldValue);
       end;
       end;
       Result:=Str_Tmp;
    end;Function  Func_SingleWhere(Str_FldName:String;Str_FldValueB,Str_FldValueE:String;If_Idf:Idf_Both):String;Overload;
    var
       Str_Tmp:String;
    begin
       Str_Tmp:='';
       Case If_Idf of
       IfBetween:        //Between条件
       begin
           if Str_FldValueB>Str_FldValueE then
               Str_Tmp:=Str_FldName+' Between '+QuotedStr(Str_FldValueE)+' And '+QuotedStr(Str_FldValueB)
           else
               Str_Tmp:=Str_FldName+' Between '+QuotedStr(Str_FldValueB)+' And '+QuotedStr(Str_FldValueE);
       end;
       IfScope:          //< 和 >条件
       begin
           if Str_FldValueB>Str_FldValueE then
               Str_Tmp:=Str_FldName+' > '+QuotedStr(Str_FldValueE)+' And '+Str_FldName+' < '+QuotedStr(Str_FldValueB)
           else
               Str_Tmp:=Str_FldName+' < '+QuotedStr(Str_FldValueE)+' And '+Str_FldName+' > '+QuotedStr(Str_FldValueB);
       end;
       end;
       Result:=Str_Tmp;
    end;
    Function  Func_WholeWhere(WhereOne:TArrayTWhereOne):String;Overload;
    var
       Str_Tmp:String;
       Int_i:Integer;
    begin
       Str_Tmp:='1=1';
       For Int_i:=Low(WhereOne) to High(WhereOne) do
       begin
           Str_Tmp:=Str_Tmp+' '+WhereOne[Int_i].Str_Con+' '+Func_SingleWhere(WhereOne[Int_i].Str_FldName,
                                                                             WhereOne[Int_i].Str_FldValue,
                                                                             WhereOne[Int_i].If_Idf);
       end;
       Result:=Str_Tmp;
    end;
    Function  Func_WholeWhere(WhereTwo:TArrayTWhereTwo):String;Overload;
    var
       Str_Tmp:String;
       Int_i:Integer;
    begin
       Str_Tmp:='1=1';
       For Int_i:=Low(WhereTwo) to High(WhereTwo) do
       begin
           Str_Tmp:=Str_Tmp+' '+WhereTwo[Int_i].Str_Con+' '+Func_SingleWhere(WhereTwo[Int_i].Str_FldName,
                                                                             WhereTwo[Int_i].Str_FldValueB,
                                                                             WhereTwo[Int_i].Str_FldValueE,
                                                                             WhereTwo[Int_i].If_Idf);
       end;
       Result:=Str_Tmp;
    end;
      

  2.   


    Function  Func_ExecuteQuery(ADOQuy:TADOQuery;Str_SQL:String):Integer;Overload;
    var
       Int_Tmp:Integer;
    begin
       Int_Tmp:=-1;
       if (ADOQuy=nil) or (Str_SQL='') then
       begin
           Result:=Int_Tmp;
           Application.MessageBox('数据集或SQL语句传错!','提示信息',MB_OK+MB_ICONINFORMATION);
           Exit;
       end;
       try
           with ADOQuy do
           begin
               Close;
               SQL.Clear;
               SQL.Add(Str_SQL);
               Open;
               IF Not IsEmpty Then
                   Int_Tmp:=ADOQuy.RecordCount
               else
                   Int_Tmp:=-1;
           end;   Except
           on E:Exception do
           Application.MessageBox(PChar('执行查询操作出错!  错误原因如下:'+Chr(10)+E.message),
                                                                      '错误提示',MB_OK+MB_ICONERROR);
       end;
       Result:=Int_Tmp;
    end;Function  Func_ExecuteQuery(BDEQuy:TQuery;Str_SQL:String):Integer;Overload;
    var
       Int_Tmp:Integer;
    begin
       Int_Tmp:=-1;
       if (BDEQuy=nil) or (Str_SQL='') then
       begin
           Result:=Int_Tmp;
           Application.MessageBox('数据集或SQL语句传错!','提示信息',MB_OK+MB_ICONINFORMATION);
           Exit;
       end;
       try
           with BDEQuy do
           begin
               Close;
               SQL.Clear;
               SQL.Add(Str_SQL);
               Open;
               IF Not IsEmpty Then
                   Int_Tmp:=BDEQuy.RecordCount
               else
                   Int_Tmp:=-1;
           end;
       Except
           on E:Exception do
           Application.MessageBox(PChar('执行查询操作出错!  错误原因如下:'+Chr(10)+E.message),
                                                                      '错误提示',MB_OK+MB_ICONERROR);
       end;
       Result:=Int_Tmp;
    end;//-----------------------------------------------------------------
    // --------------------以下是类的处理过程--------------------------
    //-----------------------------------------------------------------end.