AdoDataSet.RecordSet的串行化和还原

http://hmyhuo1983.blog.163.com/blog/static/538196192013152161572/

 

AdoDataSet.RecordSet的串行化和还原  

2013-02-05 15:58:25|  分类: DELPHI |  标签: |字号 订阅

//数据集串行化

function RecordsetToXML(const Recordset: _Recordset): string;
var
  RS: Variant;
  Stream: TStringStream;
begin
  Result := '';
  if Recordset = nil then Exit;

  Stream := TStringStream.Create(''); //注意这里这指定 编码格式。


Stream := TStringStream.Create('',TEncoding.UTF8);

  try
    RS := Recordset;
    // adPersistADTG保存为二进制文件  adPersistXML保存为xml。二进制的传输效率要高于XML
    RS.Save(TStreamAdapter.Create(stream) as IUnknown, adPersistADTG);
    Stream.Position := 0;
    Result := Stream.DataString;
  finally
    Stream.Free;
  end;
end;

StrXML := RecordsetToXML(FAdoQuery.Recordset);

//压缩数据,注意压缩比率不要选择最高
      IsCompress := ECLCompressAndEncryptString(StrXML, OutStr, passWord, CompressionLevel, false);
      if IsCompress then
      begin

//格式化为16进制字符串
        CompressStr := StrtoFormat(pChar(OutStr), Length(OutStr), fmtHEX);

//告诉接收方将要发送数据的长度
        AThread.Connection.WriteInteger(Length(CompressStr));
        Stream := TStringStream.Create(CompressStr);

//发送数据
        AThread.Connection.WriteStream(Stream, True);
        Stream.Free;

 

//还原数据集

function RecordsetFromXML(const XML: string): _Recordset;
var
  RS: Variant;
  Stream: TStringStream;
begin
  Result := nil;
  if XML = '' then Exit;

  try
    Stream := TStringStream.Create(XML);
    Stream.Position := 0;
    RS := CreateOleObject('ADODB.Recordset');
    RS.Open(TStreamAdapter.Create(Stream) as IUnknown);
    Result := IUnknown(RS) as _Recordset;
  finally
    Stream.Free;
  end;
end;

 

procedure TTCPAdoClient.Open(Value : String);
var HexStr, DecStr: String;      
  Stream : TStringStream;  Lenbuf : Integer;
begin
  Value := Uppercase(Value);
  FIdTCPClient.WriteLn('SELECTSQL: ' + Value);
  FCommand := Value;
  Application.ProcessMessages;
  if not FIdTCPClient.Connected then
    exit;
  LenBuf := FIdTCPClient.ReadInteger;
  Stream := TStringStream.Create('');
  try

//读取数据
    FIdTCPClient.ReadStream(Stream, LenBuf, False);

    HexStr := FormatToStr(pChar(Stream.DataString), Length(Stream.DataString), fmtHEX);

//解压缩数据
    ECLDecompressAndDecryptString(HexStr, DecStr, passWord);
    Application.ProcessMessages;
//还原数据集
    FRecordSet :=  RecordsetFromXML(DecStr);
  finally
    Stream.Free;
  end;
  RecordSet := FRecordSet;
end;


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值