msgpack 序列还原 TFDParams

     在三层开发中我们不能直接把sql语句写在客户端,虽然软件最终是通过sql和数据库打交道的,这个时候我们该怎么办呢,我们可以通过 客户端传递参数,服务端插件解析参数的方式来解决这个问题,这样还可以避免类似sql注入的漏洞,好了,不多说,本文重点是序列还原 TFDParams

   在ClientDatset的时候  我们可以序列化Tparams 为OleVariant  (在DBClient单元    UnpackParams /PackageParams)

   我在Firedac中还未找到序列化TFDParams的方法,所以自己就模仿PackageParams 写了 TFDParams 和流转和的函数。

(如果哪位高手知道系统有自带的函数,高手我一下哈)

  

/// <summary>
 /// 参数序列化流
 /// </summary>
 /// <param name="aParams"></param>
 /// <returns>TStream</returns>

function TForm1.ParamsToStream(aParams: TFDParams): TStream;
var
  QMP: TQMsgPack;
  I, Idx, Count: Integer;
begin

  QMP := TQMsgPack.Create;
  Result := TMemoryStream.Create;
  try
    Count := 0;
    for I := 0 to aParams.Count - 1 do
      if aParams[I].ParamType in AllParamTypes then
        Inc(Count);
    if Count > 0 then
    begin
      Idx := 0;
      for I := 0 to aParams.Count - 1 do
        if aParams[I].ParamType in AllParamTypes then
        begin
          QMP.ForcePath(idx.ToString).ForcePath('Name').AsString := aParams[I].Name;
          QMP.ForcePath(idx.ToString).ForcePath('Value').AsVariant := aParams[I].Value;
          QMP.ForcePath(idx.ToString).ForcePath('DataType').AsInteger := Ord(aParams[I].DataType);
          QMP.ForcePath(idx.ToString).ForcePath('ParamType').AsInteger := Ord(aParams[I].ParamType);
          QMP.ForcePath(idx.ToString).ForcePath('Size').AsInteger := aParams[I].Size;
          QMP.ForcePath(idx.ToString).ForcePath('Precision').AsInteger := aParams[I].Precision;
          QMP.ForcePath(idx.ToString).ForcePath('NumericScale').AsInteger := aParams[I].NumericScale;
          Inc(Idx);
        end;
    end;
    QMP.SaveToStream(Result);
  finally
    QMP.Free;
  end;

end;

/// <summary>
///  流还原成 TFDParams
/// </summary>
/// <param name="Stream"></param>
/// <returns>TFDParams</returns>

function TForm1.StreamTOParams(Stream: TStream): TFDParams;
var
  QMP: TQMsgPack;
  LParam: TFDParam;
  I: Integer;
begin

  QMP := TQMsgPack.Create;
  Result := TFDParams.Create;
  try
    Stream.Position := 0;
    QMP.LoadFromStream(Stream);
    for I := 0 to QMP.Count - 1 do
    begin
      LParam := TFDParam(Result.Add);
      LParam.Name := QMP.ForcePath(i.ToString).ForcePath('Name').AsString;
      LParam.DataType := TFieldType(QMP.ForcePath(i.ToString).ForcePath('DataType').AsInteger);
      LParam.ParamType := TParamType(QMP.ForcePath(i.ToString).ForcePath('ParamType').AsInteger);
      LParam.Size := QMP.ForcePath(i.ToString).ForcePath('Size').AsInteger;
      LParam.Precision := QMP.ForcePath(i.ToString).ForcePath('Precision').AsInteger;
      LParam.NumericScale := QMP.ForcePath(i.ToString).ForcePath('NumericScale').AsInteger;
      LParam.Value := QMP.ForcePath(i.ToString).ForcePath('Value').AsVariant;
    end;
  finally
    QMP.Free;
  end;

end;



调用: 

  TMS := ParamsToStream(FDQuery1.Params);//序列化参数
  FDQuery1.Params.Clear;
  TMS.Position := 0;
  FDQuery1.Params.Assign(StreamToParams(TMS));//还原参数





全部源码 我已经上传到 :

http://download.csdn.net/detail/u013051638/9717314

Q群 Delphi Home 235236282,欢迎delphi 爱好者加入,一起学习、进步。




猜你喜欢

转载自blog.csdn.net/u013051638/article/details/53781775
今日推荐