一个ClientDataset的Delta与XML相互转换

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


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

unituDelta;

interface

usesDBClient,DSIntf,VarUtils,ActiveX;

functionDeltaToXML(Delta:OleVariant):String;
functionXMLToDelta(XMLData:String):OleVariant;

implementation

procedureCheck(FDSBase:IDSBase;Status:DBResult);
var
ErrMsg:array[0..2048]ofChar;
begin
ifStatus<>0then
begin
FDSBase.GetErrorString(Status,ErrMsg);
raiseEDBClient.Create(ErrMsg,Status);
end;
end;

functionDeltaToXML(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;

functionXMLToDelta(XMLData:String):OleVariant;
varDelta:OleVariant;
DataPacket:TDataPacket;
FDSBase:IDSBase;
begin
Delta:=StringToVariantArray(XMLData);
SafeArrayCheck(SafeArraycopy(VarToDataPacket(Delta),DataPacket));
CreateDbClientObject(CLSID_DSBase,FDSBase);
Check(FDSBase,xmlOFF);
Check(FDSBase,Result);
//FreeDataPacket(DataPacket);
end;

end.


原文出处:
http://hi.baidu.com/0xcea4/item/27f77f338b1abf81c2cf2928

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念