博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个ClientDataset的Delta与XML相互转换
阅读量:6223 次
发布时间:2019-06-21

本文共 1824 字,大约阅读时间需要 6 分钟。

一个ClientDataset的Delta与XML相互转换的文章:

大家都知道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.

转载于:https://www.cnblogs.com/chenmfly/p/4496377.html

你可能感兴趣的文章
Windows 7 - folder options / single-click or double-click
查看>>
IP分组格式
查看>>
Cocos2d策略类塔防精品手游-MiniTD独家完整源码
查看>>
怎么样和老师学英语呀?
查看>>
【小松教你手游开发】【unity实用技能】unity在游戏中更换角色的shader,比如加个流光...
查看>>
一个脚本实现Mysql的备份
查看>>
内核源码研读预备知识
查看>>
linux 双网卡共享网络
查看>>
CentOS6.5下安装配置VNC
查看>>
javascript成神之路(2):深入理解原型以及原型链的重要性
查看>>
针对WPF开发的报表工具控件Stimulsoft Reports.Wpf
查看>>
电商改变了我们什么?
查看>>
JavaScript之数组Array
查看>>
MySQL-NonMySQL同步工具源码解读——鉴权与注册
查看>>
Oracle SQL Developer 语言设置
查看>>
未解决安装产品 D:\ru\ClientLanguagePack.msi 失败。错误代码为 1603
查看>>
Hadoop集群日常运维
查看>>
Redis的过期策略
查看>>
安装epel源出错解决方法 Cannot retrieve metalink for repository
查看>>
源码安装apache
查看>>