zoukankan      html  css  js  c++  java
  • AdoDataSet.RecordSet的串行化和还原

    //数据集串行化

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

      Stream := TStringStream.Create('');
      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;

  • 相关阅读:
    gitlab安装笔记二_Centos7配置163yum源
    gitlab安装笔记一_虚拟机中安装Centos7
    初篇:我与Linux
    Redis分布式锁正确的实现方法
    MacOS从零开始搭建hexo博客
    docker服务编排--docker-compose
    多线程问题整理
    maven依赖范围
    linux打开文件数 too many open files 解决办法
    【数据结构】队列-数组模拟队列
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/2940650.html
Copyright © 2011-2022 走看看