基于WCF技術的報表服務擴展

作者: James Li  來源: 博客園  發布時間: 2010-03-31 10:30  閱讀: 696 次  推薦: 0   原文鏈接   [收藏]  

這項技術被我鼓吹了很久,今天終于有機會拿出來展示一下。 

為什么要進行擴展呢?擴展的目的是為了和自己現有的系統整合在一起。比如現有系統已經很復雜,能處理很多業務,設計系統的開發人員沒有充分考慮到技術的變更,當一項新技術推出以后,為了能把新技術應用到舊有的系統中,我們需要對新技術做一些擴展,以方便應用到我們的現有系統中。

追隨新技術改系統是比較笨的方法。以例子為證,一開始,系統用Remoting作為通信框架,WCF橫空出世后,又把自己的系統用WCF技術重寫一遍通信框架。這種做法很累,一不小心及到業務方面的修改,系統的穩定性大打折扣。

新技術一般都留下有擴展的接口和方法,對新技術研究充分,寫點擴展。既能應用新技術的方便,又可以讓現在的系統不作任何改動,這種方法值得向大家推薦。當然,作為主程序員的你,一般要犧牲數個周末的時間去研究新技術,而且關于做擴展(Extension)類的知識庫和文章,一般要借助于老外的英語博客才能找到答案。人家分工細,自然在各方面都做的比較好。

做報表,一般是直接用SQL語句,生成一個XSD的架構文件,它包含字段。然后把字段拖動到報表中,形成報表設計文件,運行時再給報表傳送數據即可。這里介紹的方法,是把SQL語句包裝到一個.NET Assembly中,通過調用Assembly,間接調用SQL來設計報表。

數據處理方面的擴展,我還了解到如何從Web Services中取數據字段,然后應用于報表設計。這篇文章是介紹如何從.NET 服務器取數據,然后應用于報表設計。

目的:搭建一個報表設計,開發的工具箱

基于WCF制作的服務器,負責抓取數據;報表設計器向服務器發送查詢語句請求,接受服務器返回值

原本的SQL查詢語句的寫法是這樣:
image
現在我們換成這樣的查詢數據庫的寫法
image

也就是這樣的查詢語句的寫法
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)
image

如果你不熟悉這里面的接口和方法,請參考我的這篇文章,
Reporting Services Extension:File Share Data Processing Extension全程指南

它是用來為這篇文章熱身用的。

設計服務器項目(Console Project)
image

它只有一個Program文件,代碼如下
image

這是打開服務器的代碼。通常合適的做法是把Console項目類型轉化為Windows Services.

為了方便調試擴展項目,我先寫一個測試客戶端項目,以方便調試問題。

擴展項目測試客戶端(Console)
 image

主要代碼如下

 

 
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();
}
}

打開報表服務器,運行這個項目,以驗證服務器和客戶端是否可以正常通信。
image
運行任何與擴展相關的程序,必須先打開這個服務器。

查詢項目(Class Library)

 

這個項目把SQL語句封裝成程序集,供報表服務器反射調用之,返回數據集給客戶端。
Quotation類的代碼如下
image

您可能已經注意到了,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,輸入本機服務器地址作為連接字符串
image 
撰寫查詢語句
image 
執行查詢,刷新字段以用來設計報表
image
下面的步驟與以通常開發報表的方法沒有任何不同。
進入布局頁面,設計報表
image
預覽一下效果,輸入參數CustomerID:TRADH
image 
這樣,終于實現了這種結構的報表設計擴展。
 

關于報表設計和開發,我還整理了如下文章
實現多國語言的Reporting Services項目 ,用于講解與報表全球化相關的設計方法
如果你不熟悉基本的報表開發,設計流程,這里有詳細的介紹
ASP.NET RDLC 報表開發詳解
如果部署時有問題,可參考這篇文章
部署含有ReportView的控件的ASPX頁面時出現錯誤
這個系列的文章比較雜亂,沒有系統化。

園子里有朋友征求關于Reporting Services的開發教程或總結,這個主意不錯。很早以前,園子里有位報表的高手:蠟人張。我那時就是看他的文章,才逐步熟悉Reporting Services技術的。真的很感激這些無私奉獻的朋友。
關于驗證擴展(Forms Authentication),可以參考這位朋友的文章:
實現SQL2008 Reporting Service的表單驗證

還有其它方面的擴展。比如做一個報表Item的擴展,做一個barcode,作為報表項,與常用的Table,Matrix一樣,被報表重復使用。關于這個主題,你可以參考PolygonsCustomReportItem項目,把barcode技術集成到Reporting Services中。

0
0
 
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()