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;
     
  • 相关阅读:
    【Mobius绮丽的辗转】莫比乌斯反演
    【BZOJ2301】【HAOI2011】Problem b 莫比乌斯反演
    【JZOJ3636】【BOI2012】Mobile(mobile)
    【JZOJ3640】【COCI2014】utrka
    VMware虚拟机无法上网 无法启动VMnet0等问题【转载】
    java map 遍历
    java List<String> 转换成带逗号的字符串
    javascript 请求action传递中文参数乱码问题
    jQuery ajax 传递JSON数组到Spring Controller
    Eclipse 在线安装properties编辑插件
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/9399943.html
Copyright © 2011-2022 走看看