论Delphi和DotNet的WebService实现技术

Tag: Delphi .net WebService 最近公司有个系统升级,老系统为delphi所编写;老系统为传统的C/S两层结构,有一个瓶颈就是我们的客户端经常需要从数据库刷新数据 ,而且这些数据都是一样的,这极大地影响了系统效率,在系统升级时我们考虑使用WebService解决这一瓶颈;初步想法是需要刷新数据时由 WebService中间层去数据库提取数据,所有的客户端都到中间层拿刷新后的数据,这样就避免了所有的客户端都直接去操作数据库提取同样的 数据。但是用什么平台实现WebService中间层呢?根据公司的技术特点,那么我们初步定为考虑.net和delphi自己做中间层。 用.net作为中间层实现,优势很明显: 1.微软已经把WebService框架搭建好,开发非常简单; 2.我们的服务器为微软平台,使用微软的.net技术应当能够提供很好的效率; 3..net平台提供了现成的全局Session对象,很容易实现我们的需求。 劣势为: 1. 系统采用两套开发平台,接口不统一;比如说.net的数据集DataSet在delphi里怎么用? 2. 两套开发平台增加程序员学习难度和维护难度; 使用delphi作为中间层实现,我们预想好处为: 1. 中间层和客户端都为delphi实现,提供较好的兼容性,可能可以直接传递数据集; 2. 统一的开发平台,易于学习和维护; 劣势为: 1. 我们使用的Delphi版本为6.0,显然它不是作为分布式开发的主流平台; 2. 如何控制全局数据集估计没有.net方便; 3. 效率不可预见; 我查阅了很多文章,有如下结论: 1. Delphi作为中间层实现的话,除了能够传递简单类型以外;负载类型只能支持继承自TRemoteTable的子孙类,以及这些子孙类组成的动态 数组;这样我所预想的直接传递数据集的想法落空;只能在中间层得到数据集后,变为动态数组传递到客户端,客户端解析后还原为数据集, 效率太低; 2. .net平台DataSet可以化为xml数据流传递为delphi客户端,delphi客户端可以根据事先定义好的解析文件,将此xml数据流装载到 TClientDataSet中; 就这两点就足以使我选择了.net作为中间层实现; 其中的技术关键点就是中间层的DataSet和Delphi的ClientDataSet的转换,下面给出具体实现方法: .net端的示例代码如下: DataSet ds = SqlHelper.ExecuteDataset(conStr,CommandType.Text,sqlText);//得到DataSet System.Text.StringBuilder strbuilder=new System.Text.StringBuilder(); System.IO.StringWriter writer=new System.IO.StringWriter(strbuilder); ds.WriteXml(writer,System.Data.XmlWriteMode.IgnoreSchema);//将DataSet转换为xml数据流,忽略一些dataset特有的动作结构等 return strbuilder.ToString(); 客户端收到的数据流入下所示: <车辆编码> 00001 <实际标识> adah <工作状态> 8 <所属分站编码> 001 <插入时间> 2005-08-23T10:15:28.6170000+08:00
<车辆编码> 00002 <实际标识> b <工作状态> 7 <所属分站编码> 002 <插入时间> 2005-08-23T11:11:56.7570000+08:00
<车辆编码> 00003 <实际标识> c <工作状态> 64 <所属分站编码> 003 <插入时间> 2005-08-23T11:15:52.3070000+08:00
注意,我们需要给这个xml文件流添加第一行 。 将这个xml文件流保存到文件data.xml中;用自带的工具XmlMapper打开data.xml,生成transfromation结构,保存到Todp.xtr文件中; Delphi端演示代码 var xmlStr: string; st: TSTringStream; XMLDoc:IXMLDocument; begin xmlStr:= GetService1Soap.GetAmbulance; xmlStr:= ' ' + #10 + xmlStr; st:= TStringStream.Create(xmlStr); ClientDataset1.Active := FALSE; //SOAPResponse.Position := 0; XMLDoc := NewXMLDocument; XMLDoc.Encoding := 'GB2312'; //SOAPResponse.Position := 0; XMLDoc.LoadFromStream(st); XMLTransformProvider1.TransformRead.SourceXmlDocument := XMLDoc.GetDOMDocument; ClientDataset1.Active := TRUE; 其中XMLTransformProvider1的TransformRead的TransformationFile属性选择我们生成的Todp.xtr,ClientDataSet1的Providor属性选择 XMLTransformProvider1;这样就将数据倒入道ClientDataSet中。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本方案用提供Delphi7与.NET程序的协同开发, .NET程序开发服务端, Delphi7客户端。客户端只需实现界面、用户输入操作 及错误显示(提示),其他操作(包括对客户端数据集或者单条记录的校验都是发回到服务端进行的)都在服务端完成。服务端 支持部署在Web服务器(IIS, Webservice)或者独立服务器(可作为Windows程序独立运行或者Windows服务运行,TCP协议)。 "友一分销管理系统"是基于该框架实现的,详见"POS管理用户手册.doc",初始设置见"Readme.doc"。 一 .NET(C#)服务组件说明 .NET(C#)服务组件开发基于DotNetFrame4.0, 服务端集成Castle实现对AOP的支持。只要在项目中引用BuleCommon.dll程序集, 类(Class)继承于BuleCommon.BuEntity.BuEntityObj, 并且在类和方法前指定[BuleCommon.BuEntity.BuEntityAttribute()] 特性, 实现Bule_EntityRegClass : IBule_EntityRegClass注册类完成服务组件注册即可。 服务组件类框架: using BuleCommon; using BuleCommon.BuEntity; namespace BuJxcData { [BuEntity()] //使客户端能获取该服务组件(class) public class BuIOBillValidate : BuEntityObj { [BuEntity(BuEntityMethod.bemValidate)] //使客户端能获取该服务组件单记录校验方法 public virtual bool Buf_CallCalcFields(ref BuleEntityCall EntityData, ref BuRecordSet RecordSet) { } [BuEntity(BuEntityMethod.bemValidates)]//使客户端能获取该服务组件多记录校验方法 public virtual bool Buf_RefreshPriceList(ref BuleEntityCall EntityData, ref DataSet ds) { } } [BuEntity()] //使客户端能获取该服务组件(class) public class BuCustomers : BuEntityObj { [BuEntity(BuEntityMethod.bemGetName)]//使客户端能获取该服务组件根据代码获取信息方法 public BuRecordSet Buf_GetCustData(ref BuleEntityCall EntityData) { } } [BuEntity()]//使客户端能获取该服务组件(class) public class BuStockCgInBill : BuEntityObj { [BuEntity(BuEntityMethod.bemOpen)]//使客户端能获取该服务组件打开方法 public virtual DataSet Buf_OpenBillData(ref BuleEntityCall EntityData) { } [BuEntity(BuEntityMethod.bemSave)]//使客户端能获取该服务组件保存方法 override public bool Buf_SaveBillData(ref BuleEntityCall EntityData, ref DataSet ds) { } [BuEntity(BuEntityMethod.bemAudit)]//使客户端能获取该服务组件审核方法 public bool Buf_SaveCgInAuditBill(ref BuleEntityCall EntityData, ref DataSet ds) { } } } 二. Bule VCL组件说明 1.Bu_ClientObj 用于提供模块注册信息(模块名称,子系统编号,模块编号等)及访问服务器的方法(通

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值