程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> 報表服務擴展:基於WCF技術的報表服務擴展

報表服務擴展:基於WCF技術的報表服務擴展

編輯:關於C#
 

為什麼要進行擴展呢?擴展的目的是為了和自己現有的系統整合在一起。比如現有系統已經很復雜,能處理很多業務,設計系統的開發人員沒有充分考慮到技術的變更,當一項新技術推出以後,為了能把新技術應用到舊有的系統中,我們需要對新技術做一些擴展,以方便應用到我們的現有系統中。
追隨新技術改系統是比較笨的方法。以例子為證,一開始,系統用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<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();         
       }
   }
打開報表服務器,運行這個項目,以驗證服務器和客戶端是否可以正常通信。
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中。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved