大家都知道TClientDataSet的Delta属性保存数据集的变化,但是Delta是OleVariant类型的属性,这样如果用Delphi写Webservice,就有需要把它转成XML,特别是其他语言也要用这个Webservice的时候,因为如果Delta能和XML相互转换,Delta包的结构就是透明的了。而TClientDataSet却没有提供DeltaXML这样的属性,之前在网上找了一下,发现网上的都是把Delta赋给另一个TClientDataSet的Data,然后再通过XMLData返回XML,但这样为了一个简单的功能就得多创建一个对象实例,感觉很不好,于是研究一下TClientDataSet的源码,终于完成了Delta与XML相互转换的函数,代码如下:

unit uDelta;

interface

uses DBClient,DSIntf,VarUtils,ActiveX;

function DeltaToXML(Delta:OleVariant):String;
function XMLToDelta(XMLData:String):OleVariant;

implementation

procedure Check(FDSBase:IDSBase;Status: DBResult);
var
ErrMsg: array[0..2048] of Char;
begin
if Status <> 0 then
begin
    FDSBase.GetErrorString(Status, ErrMsg);
    raise EDBClient.Create(ErrMsg, Status);
end;
end;

function DeltaToXML(Delta:OleVariant):String;
var
FDSBase: IDSBase;
DataPacket: TDataPacket;
VarPacket: OleVariant;
begin
CreateDbClientObject(CLSID_DSBase, IDSBase, FDSBase);
SafeArrayCheck(ActiveX.SafeArrayCopy(VarToDataPacket(Delta), DataPacket));
Check(FDSBase,FDSBase.AppendData(DataPacket, True));
FDSBase.SetProp(dspropXML_STREAMMODE, xmlON);
Check(FDSBase,FDSBase.StreamDS(DataPacket));
DataPacketToVariant(DataPacket, VarPacket);
Result := VariantArrayToString(VarPacket);
//FreeDataPacket(DataPacket);
end;

function XMLToDelta(XMLData:String):OleVariant;
var Delta:OleVariant;
    DataPacket: TDataPacket;
    FDSBase: IDSBase;
begin
Delta:=StringToVariantArray(XMLData);
SafeArrayCheck(SafeArrayCopy(VarToDataPacket(Delta), DataPacket));
CreateDbClientObject(CLSID_DSBase, IDSBase, FDSBase);
Check(FDSBase,FDSBase.AppendData(DataPacket, True));
FDSBase.SetProp(dspropXML_STREAMMODE, xmlOFF);
Check(FDSBase,FDSBase.StreamDS(DataPacket));
DataPacketToVariant(DataPacket, Result);
//FreeDataPacket(DataPacket);
end;

end.

Delta与XML相互转换相关推荐

  1. C#实现实体类和XML相互转换

    一.实体类转换成XML 将实体类转换成XML需要使用XmlSerializer类的Serialize方法,将实体类序列化 public static string XmlSerialize<T& ...

  2. php 数组转xml 函数,PHP数组和XML相互转换的函数

    这篇文章主要介绍了关于PHP数组和XML相互转换的函数 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下//数组转xml function ArrToXml($arr) { if(!is ...

  3. 一文帮你完美解决Json和Xml相互转换

    目录 1.导入用到的jar包 2.xml格式转换为json格式 3.json格式转换为xml格式 我们经常会碰到Json和Xml相互转换,但是转换过程中经常出现各种奇葩问题,比如多节点了或少节点了,或 ...

  4. java实体 和 xml相互转换

    参考: https://blog.csdn.net/LookForDream_/article/details/88884316 https://zhuchengzzcc.iteye.com/blog ...

  5. 使用xfire webservice接口开发,obj与xml相互转换好用工具类,不需要写大量的转换代码,亲测可用

    webservice接口开发,旧工程中存在使用xfire开发的接口,对象转换为xml和xml转换为对象的时候需要些大量的代码,工作量很大.现在提供一个比较好的对象转换为xml的工具. <!-- ...

  6. 在 JavaScript 中将 String 与 XML 相互转换

    将字符串换成 XML 对象 function convert_string_to_xml(strXML) { if (window.ActiveXObject) { xmlDoc=new Active ...

  7. Java对象与XML、Excel、TXT文件相互转换

    一.目的 文件的存储与导出java对象,文件格式包括xml.txt.xlxs三种文件格式 二.准备 Student 类 /*** 学生的信息(学号.姓名.电话.邮箱信息)** @ClassName S ...

  8. 了解女友的心还不如了解Python之在Python中解析和修改XML

    2021年12月15日 10:14 ·  阅读 30 摘要: 工作中我们时常需要解析用不同语言编写的数据.Python 提供了许多库来解析或拆分用其他语言编写的数据.在这篇 Python XML 解析 ...

  9. java 判断对象是否是xml格式_java对象与xml格式之间的转换

    java对象是可以直接与xml相互转换的,但需要导入包:xstream-1.3.1.jar,在创建对象的时候,注意一定要new一个DomDriver: 成功的测试代码如下: package com.x ...

最新文章

  1. 我们为什么选择Kubernetes
  2. python转移环境_python 虚拟环境及项目快速迁移
  3. django中序列化器字段参数、关联字段
  4. OpenGL阴影贴图
  5. mysql从oracle取数_Oracle通过过程定期取数
  6. 通过hibernate去调用存储过程
  7. Git-分布式版本控制系统
  8. Centos 云服务器磁盘占用率90%以上的排查解决
  9. 那些年让我们头疼的CSS3动画
  10. AD的命名规则 AD常用产品型号命名规则
  11. 2019.6.18 区块链论文翻译
  12. 清华大学计算机考研资料汇总
  13. VBA实例6 CorelDraw 批量生成设备位号、连续编号
  14. 计算机等级考试 设置表格居中,Word表格水平居中怎么设置
  15. unicloud云开发---uniapp云开发(二)---云存储基础
  16. 'utf-8' codec can't decode byte 0xb5 in position : invalid start byte
  17. Android动态更改TextView的字体大小
  18. javascript案例16——判断输入的年份是否是闰年、判断闰年
  19. 标量、向量、矩阵求导大全
  20. memcache set操作详解

热门文章

  1. 【实用】windows常用软件及下载地址
  2. python判断输入的内容是否为一个数字(整数、负数)
  3. ggplot2之图例修改
  4. 【庖丁解牛】MySQL编译出现报错 : Could not find rpcgen 解决方案
  5. php实现用户在线时间统计详解
  6. java 一年中的第几天_java中计算指定日期是一年的第几天的方法
  7. 最小堆以及最小优先队列的实现
  8. 基于OpenCV的全景拼接
  9. 综合布线的主要三大布线系统
  10. 函数式编程中的战斗机--elm编写实例(薛定鄂的猫