技术开发 频道

从陌生到熟悉:WCF技术报表服务扩展

  【IT168技术】为什么要进行扩展呢?扩展的目的是为了和自己现有的系统整合在一起。比如现有系统已经很复杂,能处理很多业务,设计系统的开发人员没有充分考虑到技术的变更,当一项新技术推出以后,为了能把新技术应用到旧有的系统中,我们需要对新技术做一些扩展,以方便应用到我们的现有系统中。

  追随新技术改系统是比较笨的方法。以例子为证,一开始,系统用Remoting作为通信框架,WCF横空出世后,又把自己的系统用WCF技术重写一遍通信框架。这种做法很累,一不小心及到业务方面的修改,系统的稳定性大打折扣。

  新技术一般都留下有扩展的接口和方法,对新技术研究充分,写点扩展。既能应用新技术的方便,又可以让现在的系统不作任何改动,这种方法值得向大家推荐。当然,作为主程序员的你,一般要牺牲数个周末的时间去研究新技术,而且关于做扩展(Extension)类的知识库和文章,一般要借助于老外的英语博客才能找到答案。人家分工细,自然在各方面都做的比较好。

  做报表,一般是直接用SQL语句,生成一个XSD的架构文件,它包含字段。然后把字段拖动到报表中,形成报表设计文件,运行时再给报表传送数据即可。这里介绍的方法,是把SQL语句包装到一个.NET Assembly中,通过调用Assembly,间接调用SQL来设计报表。

  数据处理方面的扩展,我还了解到如何从Web Services中取数据字段,然后应用于报表设计。这篇文章是介绍如何从.NET 服务器取数据,然后应用于报表设计。

  目的:搭建一个报表设计,开发的工具箱

  基于WCF制作的服务器,负责抓取数据;报表设计器向服务器发送查询语句请求,接受服务器返回值

  原本的SQL查询语句的写法是这样:

  现在我们换成这样的查询数据库的写法

  也就是这样的查询语句的写法

assembly=Tracking.Report.Quotation; class=Tracking.Report.Quotation; method=GetCustomerList(@Customer);

其余的报表制作,部署的步骤都不变,我改变的是数据处理部分。

  好处:充分发挥T_SQL集合计算的能力和C#在数值计算和字符串处理方面的威力

  特别是一些计算,字符串方面的处理,用SQL语句可能不方便,要写很多的T_SQL代码。但是如果用这种方法,充分发挥程序语言(C#)和数据库语言(T_SQL)的长处,把集合运算部分用T_SQL来处理,计算和字符文本的处理则留在C#代码中。

  设计扩展项目 Data Process Extension(Class Library)

  如果你不熟悉这里面的接口和方法,请参考我的这篇文章,

  Reporting Services Extension:File Share Data Processing Extension全程指南

  它是用来为这篇文章热身用的。

  设计服务器项目(Console Project)

  它只有一个Program文件,代码如下

  这是打开服务器的代码。通常合适的做法是把Console项目类型转化为Windows Services.

  为了方便调试扩展项目,我先写一个测试客户端项目,以方便调试问题。

  扩展项目测试客户端(Console)

  主要代码如下

class Program { static void Main(string[] args) { ChannelFactory scf; scf = new ChannelFactory( new NetTcpBinding(), "net.tcp://localhost:4000/Reporting"); IServiceManager s; s = scf.CreateChannel(); string assembly = "Tracking.Report.Quotation"; string cclass = "Tracking.Report.Quotation"; string method = "GetCustomerList"; object[] arg = new object[] { "TRADH" }; DataSet ds = s.GetDataSet(assembly, cclass, method, arg); if (ds != null) Console.WriteLine("Get Data :{0}", ds.Tables[0].Rows.Count); Console.ReadLine(); } }

打开报表服务器,运行这个项目,以验证服务器和客户端是否可以正常通信。

  运行任何与扩展相关的程序,必须先打开这个服务器。

  

0
相关文章