一个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 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|