• 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;
     
  • 相关阅读:
    命令执行顺序控制与管道
    js获取返回首页
    手机站点击商务通无轨迹解决方法
    js文字向上滚动代码
    文字隐藏多余的文字
    QQ弹窗代码
    百度推送代码
    js手机站跳转
    js 判断时间,满足执行框架
    js切换换class
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/9399943.html
Copyright © 2020-2023  润新知