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;

  • 相关阅读:
    进程(WINAPI),遍历并查找树状的进程信息,实现控制系统进程
    HDU 4786 Fibonacci Tree(生成树,YY乱搞)
    Linux信号通讯编程
    HDU 3635 Dragon Balls(带权并查集)
    还原数据库出现“未获得排他訪问”解决方法(杀死数据库连接的存储过程sqlserver)
    java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称而且未指定默认驱动程序解决方法
    【C++基础 02】深拷贝和浅拷贝
    内核链接的简单使用
    I2C测试【转】
    [RK3288]PMU配置(RK808)【转】
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/2940650.html
Copyright © 2011-2022 走看看