淺析基于WCF技術(shù)的報(bào)表服務(wù)擴(kuò)展
本文將講到WCF技術(shù)的報(bào)表服務(wù)擴(kuò)展,51CTO開(kāi)發(fā)頻道向您推薦《WCF開(kāi)發(fā)基礎(chǔ)》技術(shù)專(zhuān)題。
為什么要進(jìn)行擴(kuò)展呢?擴(kuò)展的目的是為了和自己現(xiàn)有的系統(tǒng)整合在一起。比如現(xiàn)有系統(tǒng)已經(jīng)很復(fù)雜,能處理很多業(yè)務(wù),設(shè)計(jì)系統(tǒng)的開(kāi)發(fā)人員沒(méi)有充分考慮到技術(shù)的變更,當(dāng)一項(xiàng)新技術(shù)推出以后,為了能把新技術(shù)應(yīng)用到舊有的系統(tǒng)中,我們需要對(duì)新技術(shù)做一些擴(kuò)展,以方便應(yīng)用到我們的現(xiàn)有系統(tǒng)中。
追隨新技術(shù)改系統(tǒng)是比較笨的方法。以例子為證,一開(kāi)始,系統(tǒng)用Remoting作為通信框架,WCF橫空出世后,又把自己的系統(tǒng)用WCF技術(shù)重寫(xiě)一遍通信框架。這種做法很累,一不小心及到業(yè)務(wù)方面的修改,系統(tǒng)的穩(wěn)定性大打折扣。
新技術(shù)一般都留下有擴(kuò)展的接口和方法,對(duì)新技術(shù)研究充分,寫(xiě)點(diǎn)擴(kuò)展。既能應(yīng)用新技術(shù)的方便,又可以讓現(xiàn)在的系統(tǒng)不作任何改動(dòng),這種方法值得向大家推薦。當(dāng)然,作為主程序員的你,一般要犧牲數(shù)個(gè)周末的時(shí)間去研究新技術(shù),而且關(guān)于做擴(kuò)展(Extension)類(lèi)的知識(shí)庫(kù)和文章,一般要借助于老外的英語(yǔ)博客才能找到答案。人家分工細(xì),自然在各方面都做的比較好。
做報(bào)表,一般是直接用SQL語(yǔ)句,生成一個(gè)XSD的架構(gòu)文件,它包含字段。然后把字段拖動(dòng)到報(bào)表中,形成報(bào)表設(shè)計(jì)文件,運(yùn)行時(shí)再給報(bào)表傳送數(shù)據(jù)即可。這里介紹的方法,是把SQL語(yǔ)句包裝到一個(gè).NET Assembly中,通過(guò)調(diào)用Assembly,間接調(diào)用SQL來(lái)設(shè)計(jì)報(bào)表。
數(shù)據(jù)處理方面的擴(kuò)展,我還了解到如何從Web Services中取數(shù)據(jù)字段,然后應(yīng)用于報(bào)表設(shè)計(jì)。這篇文章是介紹如何從.NET 服務(wù)器取數(shù)據(jù),然后應(yīng)用于報(bào)表設(shè)計(jì)。
目的:搭建一個(gè)報(bào)表設(shè)計(jì),開(kāi)發(fā)的工具箱
基于WCF制作的服務(wù)器,負(fù)責(zé)抓取數(shù)據(jù);報(bào)表設(shè)計(jì)器向服務(wù)器發(fā)送查詢語(yǔ)句請(qǐng)求,接受服務(wù)器返回值
原本的SQL查詢語(yǔ)句的寫(xiě)法是這樣:
現(xiàn)在我們換成這樣的查詢數(shù)據(jù)庫(kù)的寫(xiě)法
也就是這樣的查詢語(yǔ)句的寫(xiě)法
- assembly=Tracking.Report.Quotation;
- class=Tracking.Report.Quotation;
- method=GetCustomerList(@Customer);
其余的報(bào)表制作,部署的步驟都不變,我改變的是數(shù)據(jù)處理部分。
好處:充分發(fā)揮T_SQL集合計(jì)算的能力和C#在數(shù)值計(jì)算和字符串處理方面的威力
特別是一些計(jì)算,字符串方面的處理,用SQL語(yǔ)句可能不方便,要寫(xiě)很多的T_SQL代碼。但是如果用這種方法,充分發(fā)揮程序語(yǔ)言(C#)和數(shù)據(jù)庫(kù)語(yǔ)言(T_SQL)的長(zhǎng)處,把集合運(yùn)算部分用T_SQL來(lái)處理,計(jì)算和字符文本的處理則留在C#代碼中。
設(shè)計(jì)擴(kuò)展項(xiàng)目 Data Process Extension(Class Library)
如果你不熟悉這里面的接口和方法,請(qǐng)參考我的這篇文章,
Reporting Services Extension:File Share Data Processing Extension全程指南
它是用來(lái)為這篇文章熱身用的。
設(shè)計(jì)服務(wù)器項(xiàng)目(Console Project)
它只有一個(gè)Program文件,代碼如下
這是打開(kāi)服務(wù)器的代碼。通常合適的做法是把Console項(xiàng)目類(lèi)型轉(zhuǎn)化為Windows Services.
為了方便調(diào)試擴(kuò)展項(xiàng)目,我先寫(xiě)一個(gè)測(cè)試客戶端項(xiàng)目,以方便調(diào)試問(wèn)題。
擴(kuò)展項(xiàng)目測(cè)試客戶端(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();
- }
- }
打開(kāi)報(bào)表服務(wù)器,運(yùn)行這個(gè)項(xiàng)目,以驗(yàn)證服務(wù)器和客戶端是否可以正常通信。
運(yùn)行任何與擴(kuò)展相關(guān)的程序,必須先打開(kāi)這個(gè)服務(wù)器。
查詢項(xiàng)目(Class Library)
這個(gè)項(xiàng)目把SQL語(yǔ)句封裝成程序集,供報(bào)表服務(wù)器反射調(diào)用之,返回?cái)?shù)據(jù)集給客戶端。
Quotation類(lèi)的代碼如下
您可能已經(jīng)注意到了,GetCustomerList方法就是以下SQL語(yǔ)句的C#封裝
- SELECT [CustomerID],[CompanyName],[ContactName]
- ,[ContactTitle],[Address],[City]
- ,[Region] ,[PostalCode],[Country]
- ,[Phone] ,[Fax]
- FROM [Northwind].[dbo].[Customers]
- WHERE CustomerID=@CustomerID
至此,所有的服務(wù)器端項(xiàng)目都設(shè)計(jì)完畢,您需要部署Extension項(xiàng)目。
如果不熟悉Extension的部署,請(qǐng)參考這篇文章
Reporting Services Extension:File Share Data Processing Extension全程指南
下面進(jìn)入應(yīng)用開(kāi)發(fā)部分,打開(kāi)BIDS,新建一個(gè)報(bào)表項(xiàng)目,添加報(bào)表項(xiàng)。
在數(shù)據(jù)連接字符串部分,糊弄選開(kāi)發(fā)的Extension,輸入本機(jī)服務(wù)器地址作為連接字符串
撰寫(xiě)查詢語(yǔ)句
執(zhí)行查詢,刷新字段以用來(lái)設(shè)計(jì)報(bào)表
下面的步驟與以通常開(kāi)發(fā)報(bào)表的方法沒(méi)有任何不同。
進(jìn)入布局頁(yè)面,設(shè)計(jì)報(bào)表
預(yù)覽一下效果,輸入?yún)?shù)CustomerID:TRADH
這樣,終于實(shí)現(xiàn)了這種結(jié)構(gòu)的報(bào)表設(shè)計(jì)擴(kuò)展。
關(guān)于報(bào)表設(shè)計(jì)和開(kāi)發(fā),我還整理了如下文章
實(shí)現(xiàn)多國(guó)語(yǔ)言的Reporting Services項(xiàng)目 ,用于講解與報(bào)表全球化相關(guān)的設(shè)計(jì)方法
如果你不熟悉基本的報(bào)表開(kāi)發(fā),設(shè)計(jì)流程,這里有詳細(xì)的介紹
ASP.NET RDLC 報(bào)表開(kāi)發(fā)詳解
如果部署時(shí)有問(wèn)題,可參考這篇文章
部署含有ReportView的控件的ASPX頁(yè)面時(shí)出現(xiàn)錯(cuò)誤
這個(gè)系列的文章比較雜亂,沒(méi)有系統(tǒng)化。
園子里有朋友征求關(guān)于Reporting Services的開(kāi)發(fā)教程或總結(jié),這個(gè)主意不錯(cuò)。很早以前,園子里有位報(bào)表的高手:蠟人張。我那時(shí)就是看他的文章,才逐步熟悉Reporting Services技術(shù)的。真的很感激這些無(wú)私奉獻(xiàn)的朋友。
關(guān)于驗(yàn)證擴(kuò)展(Forms Authentication),可以參考這位朋友的文章:
實(shí)現(xiàn)SQL2008 Reporting Service的表單驗(yàn)證
還有其它方面的擴(kuò)展。比如做一個(gè)報(bào)表Item的擴(kuò)展,做一個(gè)barcode,作為報(bào)表項(xiàng),與常用的Table,Matrix一樣,被報(bào)表重復(fù)使用。關(guān)于這個(gè)主題,你可以參考PolygonsCustomReportItem
項(xiàng)目,把barcode技術(shù)集成到Reporting Services中
原文標(biāo)題:報(bào)表服務(wù)擴(kuò)展:基于WCF技術(shù)的報(bào)表服務(wù)擴(kuò)展
鏈接:http://www.cnblogs.com/JamesLi2015/archive/2010/03/29/1699972.html