MSGPACK序列和还原TFDParams

unit Unit1;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, qmsgpack, FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf, FireDAC.DApt.Intf, FireDAC.Stan.Async, FireDAC.DApt, Data.DB, FireDAC.Comp.DataSet, FireDAC.Comp.Client, Datasnap.DBClient, Vcl.StdCtrls;

type
TForm1 = class(TForm)
FDQuery1: TFDQuery;
cds1: TClientDataSet;
btn1: TButton;
mmo1: TMemo;
mmo2: TMemo;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }

function ParamsToStream(aParams: TFDParams): TStream;
function StreamTOParams(Stream: TStream): TFDParams;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.btn1Click(Sender: TObject);
var
TMS: TStream;
i: Integer;
str: AnsiString;
begin

with FDQuery1.Params do //创建参数
begin
Clear;
CreateParam(ftString, 'ColStr', ptInput).AsString := '字符串';
CreateParam(ftFloat, 'ColFloat', ptInput).AsFloat := 168.168;
CreateParam(ftInteger, 'ColSmallint', ptInput).AsInteger := 1234;
CreateParam(ftBoolean, 'ColBool', ptInput).AsBoolean := true;
CreateParam(ftDateTime, 'ColDatTime', ptInput).AsDateTime := now;
end;

mmo1.Clear;
mmo1.Lines.Add('序列化之前的Params');
for I := 0 to FDQuery1.Params.Count - 1 do //输出
begin
with FDQuery1 do
begin
str := Format('Name:%s Value:%s DataType:%d ParamType:%d Size:%d Precision:%d NumericScale:%d', [Params[I].Name, Params[I].Value, Ord(Params[I].DataType), Ord(Params[I].ParamType), Params[I].Size, Params[I].Precision, Params[I].NumericScale]);
mmo1.Lines.Add(str)
end;
end;

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

mmo2.Clear;
mmo2.Lines.Add('序列化还原后的Params');
for I := 0 to FDQuery1.Params.Count - 1 do //输出
begin
with FDQuery1 do
begin
str := Format('Name:%s Value:%s DataType:%d ParamType:%d Size:%d Precision:%d NumericScale:%d', [Params[I].Name, Params[I].Value, Ord(Params[I].DataType), Ord(Params[I].ParamType), Params[I].Size, Params[I].Precision, Params[I].NumericScale]);
mmo2.Lines.Add(str);
end;
end;

end;

/// <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;

end.

MSGPACK序列和还原TFDParams的更多相关文章

  1. msgpack的数据序列和还原

    msgpack的数据序列和还原 msgpack不仅可以序列一些常规的数据类型的数据,比如:string.datetime.integer...... 还能序列olevariant.stream 这就非 ...

  2. cross socket和msgpack的数据序列和还原

    cross socket和msgpack的数据序列和还原 procedure TForm1.Button1Click(Sender: TObject); begin var pack: TSimple ...

  3. 优秀的数据序列和还原类----TSimpleMsgPack

    优秀的数据序列和还原类----TSimpleMsgPack TSimpleMsgPack是D10天地弦的作品. 优点:至简,就一个单元文件实现,不需要引用其他单元. 缺点:不是标准的MSGPACK实现 ...

  4. QJSON封装好的序列和还原方法

    QJSON封装好的序列和还原方法 {*******************************************************}{ }{ QJSON与数据集互转 }{ }{ 版权所 ...

  5. JsonDataObjects序列和还原

    JsonDataObjects序列和还原 JsonDataObjects号称DELPHI最快的JSON库,且支持跨平台. // cxg 2017-9-12// Use JsonDataObjects( ...

  6. TynSerial流的序列(还原)

    TynSerial流的序列(还原) procedure TForm1.ToolButton18Click(Sender: TObject); var serial: TynSerial; ms, ms ...

  7. TynSerial基本数据类型序列(还原)

    TynSerial基本数据类型序列(还原) procedure TForm1.ToolButton17Click(Sender: TObject); var serial: TynSerial; be ...

  8. TynSerial序列(还原)TFDMemTable

    TynSerial序列(还原)TFDMemTable 1)TFDMemTable查询数据 procedure TForm1.Qrys(accountno, sql, sql2: string; Dat ...

  9. TynSerial图片序列(还原)

    TynSerial图片序列(还原) 笔者以生成图形验证码为例. function TForm1.VerifyCode(image: TImage): string; // 生成验证码和图像 var u ...

随机推荐

  1. 用户线程 (User Thread)、守护线程 (Daemon Thread)

    在Java中有两类线程:用户线程 (User Thread).守护线程 (Daemon Thread). 所谓守护 线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称 ...

  2. 单选按钮 JradioButton 和复选框 JcheckBox 的使用

    package first; import javax.swing.*; import java.awt.*; import java.awt.event.*; class BRTest extend ...

  3. certbot 免费httos证书申请

    https://keelii.com/2016/06/12/free-https-cert-lets-encrypt-apply-install/

  4. linux基础 -nginx和nfs代理 开发脚本自动部署及监控

    开发脚本自动部署及监控 1.编写脚本自动部署反向代理.web.nfs: (1).部署nginx反向代理三个web服务,调度算法使用加权轮询:  (2).所有web服务使用共享存储nfs,保证所有web ...

  5. [Leetcode Week2]Sort List

    Sort List题解 题目来源:https://leetcode.com/problems/sort-list/description/ Description Sort a linked list ...

  6. appium===元素定位

    一.常用识别元素的工具 uiautomator:Android SDK自带的一个工具,在tools目录下 monitor:Android SDK自带的一个工具,在tools目录下 Appium Ins ...

  7. 带你入门代理模式/SpringAop的运行机制

    SpringAop 是spring框架中最重要的一项功能之一,同时也是企业级开发记录事物日志等不可或缺的一部分,如果说你的系统需要记录用户访问接口的操作,那SpringAop是很完美的了,当然,拦截器 ...

  8. python基础复习-1-2 数据类型-str、list、tuple、dict

    数据类型 数字 引号: 123 数值 '123' 字符串 整数:ini long 范围:(-2**31 - 2**31) num = 123 长整型 long (L) num = 123L 浮点型:f ...

  9. MongoDB多集合排序的一种实现

    需求 假设有三个类型有所不同的表,saleorders.careorders.repairorders,表中有storeId信息,用于关联其所属的门店stores表,现在有个需求是要将这三个表集中展示 ...

  10. [ 总结 ] 删除通过find查找到的文件

    [root@cloud abc]# touch test{,,,} [root@cloud abc]# ls shadow test test1 test2 test3 test5 [root@clo ...