zoukankan      html  css  js  c++  java
  • ClientDataSet的版本兼容性

    ClientDataSet的版本兼容性

    在Delphi的早期版本中,Data这个Variant类型的值内部使用的是AnsiString来存贮的字节流,但我并不确定Delphi从什么时候开始,将其改为了Byte数组类型,你可以通过VarType函数来检测它的类型。

    1、将数据集的Data保存到MessagePack协议数据流或文件:

    var
       AMsgPack:TQMsgPack;
    begin
      AMsgPack:=TQMsgPack.Create;
      ...
      AMsgPack.AsVariant:=ClientDataSet1.Data;
      //保存到流AStream中
      AMsgPack.SaveToStream(AStream);
      //或保存到文件AFileName中
      AMsgPack.SaveToFile(AFileName);
      ...
      FreeAndNil(AMsgPack);
    end;
     
    2、从MessagePack协议数据流或文件中加载到数据集:
    var
      AMsgPack:TQMsgPack;
    begin
    AMsgPack:=TQMsgPack.Create;
    //从流AStream中加载
    AMsgPack.LoadFromStream(AStream);
    //或从文件AFileName中加载
    AMsgPack.LoadFromFile(AFileName);
    ...
    ClientDataSet1.Close;
    ClientDataSet1.Data:=AMsgPack.AsVariant;
    ...
    FreeAndNil(AMsgPack);
    end;
     

    对于早期的版本,我们需要做一个转换:

    1、从AnsiString转换为TBytes,然后再赋给AMsgPack。

    var
      S:AnsiString;
      ABytes:TBytes;
      ...
    begin
    ...
    //首先将Data赋给一个字符串对象
    S:=ClientDataSet1.Data;
    //复制到字节流中
    SetLength(ABytes,Length(S));
    Move(PAnsiChar(S)^,ABytes[0],Length(S));
    //用AsBytes替换AsVariant
    AMsgPack.AsBytes:=ABytes;
    ...
    end;
     
    2、加载时反过来将字节流反转成AnsiString
    var
      S:AnsiString;
      ABytes:TBytes;
      ...
    begin
    ...
    //首先将Data赋给一个字符串对象
    ABytes:=AMsgPack.AsBytes;
    SetLength(S,Length(ABytes));
    Move(ABytes[0],PAnsiChar(S)^,Length(ABytes));
    //然后将字符串赋给Data就好了。
    ClientDataSet1.Data:=S;...
    end;
     
  • 相关阅读:
    实验室资质认定评审准则和要素及要点
    如何进行内审?
    实验室比对结果评价的3种方法
    第一次如何申请CNAS实验室认可资质
    风险评估的实施步骤
    Servlet
    CMMI_SCAMPY评估方法
    PHP_2
    PHP_1
    java中String与StringBuilder的区别
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/9399943.html
Copyright © 2011-2022 走看看