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 爱好者加入,一起学习、进步。



 


msgpack whl文件是一种用于安装`msgpack`库的Python安装包文件。whl文件是Python的一种标准分发格式,其全称为"wheel",它是Python包管理器的一种打包格式。 `msgpack`是一种序列化库,它可以将Python的对象序列化为二进制数据,然后再将其反序列化回Python对象。这种序列化方式具有高效性和可读性,并且可以跨多种编程语言使用。 使用`msgpack`可以在不同的系统之间传递数据,并且可以实现快速的数据交换和存储。它支持多种数据类型,包括整数、浮点数、字符串、列表、字典等等。与其他序列化方式相比,`msgpack`的数据大小更小,并且速度更快。 要使用`msgpack`库,我们需要将其安装到Python环境中。而.whl文件则是一种用于Python包的安装文件格式。在安装whl文件之前,我们需要先确保已经安装了Python解释器和pip工具。 要使用whl文件安装msgpack,可以通过以下步骤进行: 1. 在Python环境中打开终端或命令提示符。 2. 切换到存放.whl文件的目录。 3. 运行以下命令: `pip install msgpack.whl` 执行上述命令后,pip将会自动从.whl文件中提取`msgpack`库,并将其安装到Python环境中。安装完成后,我们就可以在Python程序中使用`msgpack`库了。 总之,msgpack whl文件是一种用于安装msgpack库的Python安装包文件,它可以实现高效的数据序列化和反序列化,并且支持多种数据类型。使用whl文件可以方便地将msgpack库安装到Python环境中,从而在程序中使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值