MSGPACK序列和还原TFDParams
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的更多相关文章
- msgpack的数据序列和还原
msgpack的数据序列和还原 msgpack不仅可以序列一些常规的数据类型的数据,比如:string.datetime.integer...... 还能序列olevariant.stream 这就非 ...
- cross socket和msgpack的数据序列和还原
cross socket和msgpack的数据序列和还原 procedure TForm1.Button1Click(Sender: TObject); begin var pack: TSimple ...
- 优秀的数据序列和还原类----TSimpleMsgPack
优秀的数据序列和还原类----TSimpleMsgPack TSimpleMsgPack是D10天地弦的作品. 优点:至简,就一个单元文件实现,不需要引用其他单元. 缺点:不是标准的MSGPACK实现 ...
- QJSON封装好的序列和还原方法
QJSON封装好的序列和还原方法 {*******************************************************}{ }{ QJSON与数据集互转 }{ }{ 版权所 ...
- JsonDataObjects序列和还原
JsonDataObjects序列和还原 JsonDataObjects号称DELPHI最快的JSON库,且支持跨平台. // cxg 2017-9-12// Use JsonDataObjects( ...
- TynSerial流的序列(还原)
TynSerial流的序列(还原) procedure TForm1.ToolButton18Click(Sender: TObject); var serial: TynSerial; ms, ms ...
- TynSerial基本数据类型序列(还原)
TynSerial基本数据类型序列(还原) procedure TForm1.ToolButton17Click(Sender: TObject); var serial: TynSerial; be ...
- TynSerial序列(还原)TFDMemTable
TynSerial序列(还原)TFDMemTable 1)TFDMemTable查询数据 procedure TForm1.Qrys(accountno, sql, sql2: string; Dat ...
- TynSerial图片序列(还原)
TynSerial图片序列(还原) 笔者以生成图形验证码为例. function TForm1.VerifyCode(image: TImage): string; // 生成验证码和图像 var u ...
随机推荐
- Topcoder SRM 608 div1 题解
Easy(300pts): 题目大意:有n个盒子,一共有S个苹果,每个盒子有多少个苹果不知道,但是知道每个盒子的苹果下限和上限.现在要至少选择X个苹果,问如果要保证无论如何都能获得至少X个苹果,至少需 ...
- Spring - IoC(3): Bean 实例的创建方式
创建一个 Bean 实例对象的方法通常有如下方式: 调用构造器创建 Bean 实例 调用静态工厂方法创建 Bean 实例 调用实例工厂方法创建 Bean 实例 使用构造器创建 Bean 实例 XML ...
- Node.js 编码转换
Node.js自带的toString()方法不支持gbk,因此中文转换的时候需要加载第三方库,推荐以下两个编码转换库,iconv-lite和encoding. iconv, iconv-l ...
- swift对比object-c
http://www.cocoachina.com/bbs/read.php?tid=204294 WWDC 2014上苹果再次惊世骇俗的推出了新的编程语言SWIFT( 雨燕 ), 这个消息会前没有半 ...
- bayer转dng实现过程记录
前言 项目中需要将imx185出来的raw数据转成dng格式,一开始认为很简单的事情,后面才发现还是挺复杂的!!!首先考虑的是不写任何代码,直接用adobe提供的转换工具来转,结果发现,不仅是adob ...
- 用java实现word转html
由于项目需要,要完成将上传的word文件转成html文件的功能.在网上搜了一下,大致有3种方法:1.用jacob实现 2.用poi实现 3.用openoffice实现. 从网上来看好像jacob用的人 ...
- ubuntu 16.04安装redis(源码安装)zz
本文转载自: http://www.linuxdiyf.com/linux/22527.html Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Val ...
- ubantu16.04服务器错误提示没有安装php_fileinfo扩展
如果你是安装的LNMP1.3full一键安装包,安装的是php5.6.22,你会遇到这个错误,解决方法也不难,请看如下: 不需要去下载扩展,只需要进入此fileinfo目录(我这里有多个版本5.6,7 ...
- javascript面试题(一)(转载)
1,判断字符串是否是这样组成的,第一个必须是字母,后面可以是字母.数字.下划线,总长度为5-20 var reg = /^[a-zA-Z][a-zA-Z_0-9]{4,19}$/; /*注意:1.要用 ...
- validate+jquery+ajax表单验证
1.案例 1.1 Html form表单内容 <form class="cForm" id="cForm" method="post" ...