delphi多层架构多参数传递处理(前端、服务端)

前端代码:
var
vParam:TParams;
sMsg:string;
sKindStr:string;
I:Integer;
begin
vParam:=TParams.Create;
try
AddParam(vParam,'THE_CNT',ftInteger,ptInput,kmtb_Check.RecordCount);
AddParam(vParam,'KIND_STR',ftString,ptInput,sKindStr);
try
ExcuteMySQLProcedure('AddArticlepreferential',vParam,sMsg);
except
on e: Exception do
begin
Application.MessageBox(PChar(sMsg),PChar('gevraagd'),MB_ICONERROR);
exit;
end;
end;
finally
freeAndNil(vParam);
end;
end;

function ExcuteMySQLProcedure(sProcedureName:string;var vParam:TParams;var sMsg:string):Boolean;
var
oleParam:OleVariant;
vData:Binary;
I:Integer;
begin
if trim(sProcedureName)='' then exit;
vData:=Binary.Create;
result:=false;
try
oleParam:=ParamsToVariant(vParam);
vData:=BinaryFromVariant(oleParam);

FService := (acsStdFuncDataModule.rmsMain as IacsDataService); // rest of the run on the server
//Call a stored procedure and return value
FService.ExecuteProcedure(sProcedureName,vData,sMsg);
vParam.Clear;
oleParam:=ReadVariantFromBinary(vData);
VariantToParams(oleParam,vParam);
result:=true;
finally
freeAndnil(vData);
end;
end;

服务端代码:
function ExecuteProcedure(const procedureName: AnsiString; var pParam: Binary; var sMsg: AnsiString): Boolean;
var
I:Integer;
vParam:TParams;
vData:OleVariant;
begin
Result := false;
if Trim(procedureName)='' then
begin
Result := false;
sMsg := GloRs_IDsSQLStrIsEmpty;
_WriteError(tLogError,GloRs_DataBaseErrorCode + GloRs_IDsSQLStrIsEmpty);
Exit;
end;

vParam:=TParams.Create;
try
vData:=ReadVariantFromBinary(pParam);
VariantToParams(vData,vParam);
with MyStoredProc1 do begin
try
Close;
StoredProcName:=procedureName;
Params.Clear;
for I:=0 to vParam.Count-1 do
begin
Params.CreateParam(vParam.Items[I].DataType,vParam.Items[I].Name,vParam.Items[I].ParamType);
ParamByName(vParam.Items[I].Name).Value:=vParam.Items[I].Value;
end;
ExecProc;
for I:=0 to vParam.Count-1 do
begin
if (vParam.Items[I].ParamType=ptOutput) or (vParam.Items[I].ParamType=ptInputOutput) then
begin
vParam.Items[I].Value :=ParamByName(vParam.Items[I].Name).AsString;
end;
end;
pParam.Clear;

vData:=ParamsToVariant(vParam);
WriteVariantToBinary(vData,pParam);
finally
MyStoredProc1.Close;
end;
end;

Result := true;

sMsg := GloRs_IDsSQLDSSuccess;
Except
on e: Exception do
begin
sMsg := GloRs_IDsGetData;
_WriteError(tLogError,GloRs_DataBaseErrorCode + GloRs_IDsGetData + e.Message);
_WriteError(tLogError,GloRs_IDsSQLError + procedureName);
Result := false;
end;
end;
end;

用到的函数:
procedure VariantToParams(input:OleVariant;par:TParams);
// TParam 's property: fieldType, paramName, ParamType, value, size
// paramType default value ptinput
// size = sizeof(value)
var
n, i:integer;
begin
try
n:=0;
i:=0;
par.Clear;
while VarArrayHighBound(input,1)>=(n+4)do
begin
par.CreateParam(TFieldType(input[n+1]),input[n+2],input[n+4]);
par.Items[i].Value := input[n+3];
par.Items[i].Size :=SizeOf(input[n+3]);
n:=n+4;
i:=i+1;
end;
except
Exit;
end;
end;

function ParamsToVariant(par:TParams): OleVariant;
// TParam 's property: fieldType, paramName, ParamType, value, size
// paramType default value ptinput
// size = sizeof(value)
var
tmpv:OleVariant;
n,i:integer;
begin
try
tmpv:=VarArrayCreate([1,par.Count*4],VarVariant);
n:=0;
i:=0;
while par.Count>i do
begin
tmpv[n+1]:=Ord(par.Items[i].DataType);
tmpv[n+2]:=par.Items[i].Name;
tmpv[n+3]:=par.Items[i].Value;
tmpv[n+4]:=par.Items[i].ParamType;
i:=i+1;
n:=n+4;
end;
result:=tmpv;
except
Exit;
end;
end;

procedure AddParam(Params: TParams; const ParamName: string;
DataType: TFieldType;ParamType:TParamType;Value: OleVariant);
// only for client load
var
p: TParam;
begin
try
p := Params.CreateParam(DataType, ParamName, ParamType);
p.Value := Value;
p.Size := SizeOf(Value);
except
exit;
end;
end;

其中ReadVariantFromBinary、WriteVariantToBinary、BinaryFromVariant函数用到RemObjects 的uROBinaryHelpers单元
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值