在三层开发中,为了安全,通常,不会将SQL语句直接传递到服务端;
那有些功能又不能写死的软件中。。特殊是SQL。
所以通常我们会在将一些SQL语句放在数据表中,给第一个SQL语句一个ID,
这样在客户端,仅指定ID就行,可是对于一个带查询条件的SQL语句,就需要带一个依据传递到 服务器端了。
比如:我们的数据表中存在:
ID SQLSTRING
1 SELECT * FROM BASE_CLIENTDATA WHERE BH=:BH
服务器端:
functionReadData2(XH, ParamCount: Integer;
Param: OleVariant): OleVariant;
procedure GetSQLParameters(SqlText :string; var params :TStrings);
var
i,len :integer;
start, over :integer;
begin
len := length(SqlText);
start := 0;
over := 0;
for i:=1 to len do
begin
if SqlText[i] = ':' then
start := i + 1
else if ((SqlText[i] = ' ') and (start > 0))
or ((i = len) and (start > 0)
or ((SqlText[i]=',') and (start > 0))
or ((SqlText[i]=')') and (start > 0)) ) then
begin
if (i=len) and (SqlText[i]<>')') then
over := i+1
else
over := i;
params.Add(copy(SqlText,start,over-start));
start := 0;
over := 0;
end;
end;
end;
type
TData =array[0..99] of string ;
var
FSQL:String;
Data :TData;
i : Integer;
ParamNames :TStrings;
begin
try
ADOQuery.DisableControls;
ADOQuery.Close;
ADOQuery.SQL.Text:='SELECT SQLSTRING FROM XT_SQLSTRING2 WHERE ID= '+INTTOSTR(XH);
ADOQuery.Open;
if ADOQuery.IsEmpty then
FSQL := 'SELECT GETDATE() '
else
FSQL :=ADOQuery.FieldByName('SQLSTRING').asstring;
ADOQuery.Close;
ADOQuery.SQL.Text := FSQL;
if (ParamCount >0 ) and (SizeOf(Param)>0) then begin
ParamNames := TStringList.Create;
GetSqlParameters(FSQL, ParamNames);
for i := 0 to ParamCount do Data[i] := Param[i];
for i:= Low(Data) to High(Data) do
begin
ADOQuery.Parameters.ParamValues[ParamNames[i]] := Param[i];
end;
end;
ADOQuery.Open;
。。。。。。。。。。。。。。。。。
end;
客户端:
var
// RV :Variant;
V,SendV:OLEVariant;
AR:_Recordset;
AStream:_Stream; //adodb_tlb{从IDE菜单Project-import type library...引入“Microsoft ActiveX Data Object 2.8 Library”}
MS1:TMemoryStream;
P:Pointer;
s:string;
i,n : Integer;
begin
// RV := Disp_BaseDoc.ProF_ReadAdoData(ASQL);
n := Length(Param);
SendV := VarArrayCreate([0,n],varOleStr);
for I := Low(Param) to High(Param) do
SendV[i] := Param[i];
try
s:='';
V:=Disp_BaseDoc.ProF_ReadAdoData2(XH,n,SendV);
。。。。。。。。。。。。。。。。。。
原则就是
我们就一个 参数数组传递到服务端,