以下内容都是针对李维老师的《Delphi 6/Kylix2--soap/Web Service程序设计篇》一书中的实例的,我的程序框架和他做的基本一致,只是我没有进行压缩,功能上已经全部实现。遇到的问题如下:
1.李维老师在书中<>在数据库部分在更新时服务端用到了clientdataset.XMLData,客户机在发送时也是 clientdataset.XMLData,这样的话在数据量大的时候特别是有blob字段的时候,数据会很慢.因为client部分其实只要发送clientdataset.delta值进行xml封装就行了.
如例子中的Client更新原始代码如下: IQueryDataFind.UpdateData(XTToCompressSoapPacket1(DZSBFileClientDataSet.xmldata), lErrorCount); DataUpDatelbl.Caption := '更新状态:' + Inttostr(LerrorCount); XTToCompressSoapPacket1//是先进行压缩处理 服务端更新代码如下: try Self.DZSBFileClientDataSet.Active := False; Self.DZSBFileClientDataSet.XMLData := XTToUnCompressSoapPacket1(sData); IErrorCount := Self.DZSBFileClientDataSet.ApplyUpdates(0); SetComplete; except on Exception do SetAbort; end;
解决这一问题的方法就是更新时只传递已更改的数据内容,
如客户机这样处理,增加一个TempClientDataSet临时变量,利用TClientDataSet本身的功能把外部的Delta转变成XMLData格式: TempClientDataSet.Data:=DZSBFileClientDataSet.Delta ; IQueryDataFind.UpdateData(XTToCompressSoapPacket1(TempClientDataSet.xmldata), lErrorCount); DataUpDatelbl.Caption := '更新状态:' + Inttostr(LerrorCount); TempClientDataSet.Data:=Null; 服务端用dsp直接修改,其实不用dsp也是可以的,至少我的程序中就试过是可以的。 try Self.DZSBFileClientDataSet.Active := False; Self.DZSBFileClientDataSet.XMLData := XTToUnCompressSoapPacket1(sData); // IErrorCount := Self.DZSBFileClientDataSet.ApplyUpdates(0); Self.DZSBFileDataSetProvider.ApplyUpdates(DZSBFileClientDataSet.data,0,IErrorCount); SetComplete; except on Exception do SetAbort; end;