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