`
longwenbin2008
  • 浏览: 13403 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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单元
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics