报表服务扩展:基于WCF技术的报表服务扩展
这项技术被我鼓吹了很久,今天终于有机会拿出来展示一下。
为什么要进行扩展呢?扩展的目的是为了和自己现有的系统整合在一起。比如现有系统已经很复杂,能处理很多业务,设计系统的开发人员没有充分考虑到技术的变更,当一项新技术推出以后,为了能把新技术应用到旧有的系统中,我们需要对新技术做一些扩展,以方便应用到我们的现有系统中。
追随新技术改系统是比较笨的方法。以例子为证,一开始,系统用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<IServiceManager> scf;
scf = new ChannelFactory<IServiceManager>(
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();
}
}
打开报表服务器,运行这个项目,以验证服务器和客户端是否可以正常通信。
运行任何与扩展相关的程序,必须先打开这个服务器。
查询项目(Class Library)
这个项目把SQL语句封装成程序集,供报表服务器反射调用之,返回数据集给客户端。
Quotation类的代码如下
您可能已经注意到了,GetCustomerList方法就是以下SQL语句的C#封装
SELECT [CustomerID],[CompanyName],[ContactName]
,[ContactTitle],[Address],[City]
,[Region] ,[PostalCode],[Country]
,[Phone] ,[Fax]
FROM [Northwind].[dbo].[Customers]
WHERE CustomerID=@CustomerID
至此,所有的服务器端项目都设计完毕,您需要部署Extension项目。
如果不熟悉Extension的部署,请参考这篇文章
Reporting Services Extension:File Share Data Processing Extension全程指南
下面进入应用开发部分,打开BIDS,新建一个报表项目,添加报表项。
在数据连接字符串部分,糊弄选开发的Extension,输入本机服务器地址作为连接字符串
撰写查询语句
执行查询,刷新字段以用来设计报表
下面的步骤与以通常开发报表的方法没有任何不同。
进入布局页面,设计报表
预览一下效果,输入参数CustomerID:TRADH
这样,终于实现了这种结构的报表设计扩展。
关于报表设计和开发,我还整理了如下文章
实现多国语言的Reporting Services项目 ,用于讲解与报表全球化相关的设计方法
如果你不熟悉基本的报表开发,设计流程,这里有详细的介绍
ASP.NET RDLC 报表开发详解
如果部署时有问题,可参考这篇文章
部署含有ReportView的控件的ASPX页面时出现错误
这个系列的文章比较杂乱,没有系统化。
园子里有朋友征求关于Reporting Services的开发教程或总结,这个主意不错。很早以前,园子里有位报表的高手:蜡人张。我那时就是看他的文章,才逐步熟悉Reporting Services技术的。真的很感激这些无私奉献的朋友。
关于验证扩展(Forms Authentication),可以参考这位朋友的文章:
实现SQL2008 Reporting Service的表单验证
还有其它方面的扩展。比如做一个报表Item的扩展,做一个barcode,作为报表项,与常用的Table,Matrix一样,被报表重复使用。关于这个主题,你可以参考PolygonsCustomReportItem项目,把barcode技术集成到Reporting Services中。
转载于:https://www.cnblogs.com/JamesLi2015/archive/2010/03/29/1699972.html
报表服务扩展:基于WCF技术的报表服务扩展相关推荐
- 基于定位技术的位置服务
基于定位技术的位置服务一直以来是人们日常生活中的必需,定位服务主要分为室内和室外两种,目前应用于室外定位的主流技术主要有卫星定位和基站定位两种. 卫星定位即是通过接收卫星提供的经纬度坐标信号来进行定位 ...
- 帆软报表 js 调用sql_SQL Server中的报表–创建由先前创建的主报表调用的基于矩阵的子报表
帆软报表 js 调用sql Introduction 介绍 As you will remember from our last "get together" we created ...
- php家教服务系统,基于PHP技术家教信息平台的设计与实现
2017 年 6 月 25 日第 1 卷 第 1 期 现代信息科技 Modern Information Technology Jun.2017 Vol.1 No.1 272017.6 基于 PHP ...
- .NET Core微服务之基于Ocelot实现API网关服务
一.啥是API网关? API 网关一般放到微服务的最前端,并且要让API 网关变成由应用所发起的每个请求的入口.这样就可以明显的简化客户端实现和微服务应用程序之间的沟通方式.以前的话,客户端不得不去请 ...
- .NET Core微服务之基于Ocelot实现API网关服务(续)
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.负载均衡与请求缓存 1.1 负载均衡 为了验证负载均衡,这里我们配置了两个Consul Client节点,其中ClientServic ...
- [转]构建基于WCF Restful Service的服务
本文转自:http://www.cnblogs.com/scy251147/p/3566638.html 前言 传统的Asmx服务,由于遵循SOAP协议,所以返回内容以xml方式组织.并且客户端需要添 ...
- 在Asp.net应用程序中构建基于WCF Web.Api的服务
WCF Web API Preview 5 发布了,你可以官方网站下载或通过Nuget安装它. 下面让我们在Asp.net applicatoin中来实现一个非常简单的web api service. ...
- docker容器 eureka 集成_微服务:基于 Docker 的微服务架构之分布式企业级实践参考...
编者按:本文分享自CSDN技术博客,作者为 FlyWine,所有权归原著者.若有不妥,联系本头条号以做必要处理. 目录 Microservice 和 Docker 服务发现模式 客户端发现模式 Net ...
- 基于docker部署的微服务架构(九): 分布式服务追踪 Spring Cloud Sleuth
为什么80%的码农都做不了架构师?>>> 前言 微服务架构中完成一项功能经常会在多个服务之间远程调用(RPC),形成调用链.每个服务节点可能在不同的机器上甚至是不同的集群上,需 ...
最新文章
- 几何深度学习(Geometric Deep Learning)技术
- 关于SQL的基础知识点
- 设置tabbaritem的title的颜色及按钮图片
- Acwing第 17 场周赛【完结】
- jsr133-第一二章
- 让你一周变聪明的大脑保健操
- http协议--笔记
- linux内核态获取ip地址,Linux内核支持动态获取IP地址
- 一线大厂青睐的前端人,90%满足这3个条件
- mysql数据库加权随机_SQL:随机选择一行,但考虑到权重
- 50個AJAX Tools and Frameworks
- diskgenius 单文件_电脑数据恢复及分区管理软件DiskGenius 英文专业版
- oracle join过滤数据,oracle join on 数据过滤问题
- vite方式创建vue项目
- 跳石头(最小最大问题)
- 滴滴passport设计之道:帐号体系高可用的7条经验
- 全网首发:解决办法:shmget()一直失败,errno=-22
- 局域网打印机共享外网
- 翠竹林 Opencv+C++之人脸识别
- 分布式动态路由的实现
热门文章
- OllyDbg笔记-暴力破解简单判断程序(TraceMe.exe与简单Qt程序)
- 使用paintEvent()对窗口进行OpenGL2D绘图
- 500 内部服务器错误php,如何解决php 500 - 内部服务器错误
- mysql错误信息收集_MySQL错误信息记录
- php使用axios发送请求,axios源码之模拟实现axios发送请求
- java发送消息_通过java给qq邮箱发送信息
- 计算机辅助小学数学教学的研究,计算机辅助数学教学的研究
- 桥接模式和路由模式区别_联通创维光猫DT541-CSF改桥接模式方法
- c语言 方程改main的值_c语言main函数里的参数argv和argc解析
- (计算机组成原理)第二章数据的表示和运算-第三节2:IEEE754标准