RDLC中讀取Analysis Services中Cube的數據

在微軟的Report Services的rdl中,默認是支持從分許服務的Cube中查詢數據的,但是rdlc中就需要間接的方式來對Cube的數據進行訪問。

相對rdl和rdlc兩者完全就是不同的套路。兩者的差別絕對不是名字上只差個c那麼簡單,從設計的部分細節和部署的方式都有很大的區別。而實際項目中往往根據不同的情況來具體決定才用哪一種方案。

這裏推薦用兩種方式來訪問。

第一種方式是用鏈接的形式將分析服務數據庫鏈接到數據引擎服務,然後mdx查詢的邏輯寫到存儲過程裏,最後頂層應用通過調用存儲過程的方式來間接達到訪問分析服務數據庫的目的。

 

image

另外一種方案就是將數據源用方法封裝起來。由於rdlc本身是在一個c#或者vb.net項目中的,所以在rdlc中是支持把項目的一個方法作爲數據源,這樣可以在方法裏對 adomd.net進行調用,然後將mdx結果以List的方式返回給rdlc。

第一種方法的具體實現可以參考sqlserver鏈接服務器的操作,這裏主要描述第二種方法。

安裝SQLServer,過程可以參考這裏。

http://www.cnblogs.com/aspnetx/archive/2012/04/13/2446479.html

這裏推薦安裝2012版本。不考慮2012裏的新特性的話,基本上你不用太擔心先前版本能否遷移過來。

下載示例數據文件。

從codeplex下載。

DW文件:

http://msftdbprodsamples.codeplex.com/downloads/get/165405

SSAS腳本文件:

http://msftdbprodsamples.codeplex.com/downloads/get/258486

由於本文用到的Cube取自微軟官方SQLServer示例中的Adventure Works示例庫,而SSAS數據庫只提供項目文件,所以需要同時下載DW文件以供SSAS去處理。

需要留意一下的是下載的是DW數據庫,而不是OLTP數據庫,這兩個庫在結構上有很大的差別,不要下載錯。

首先將下載下來的數據庫文件附加進數據引擎服務。

image

 

打開SSAS腳本文件。

image

 

可以看到VS2010設計器被打開。(話說等這個等了好久。。。)

如果你有裝VS2012,這裏需要右鍵選擇用VS2010來打開。

image

 

右鍵項目,處理一下SSAS數據庫。

image

 

處理過程跟先前的版本沒什麼大的區別。

image

 

接下來,假如我們要在rdlc中顯示如下的mdx語句的查詢結果。

RDLC中讀取Analysis Services中Cube的數據

 

image

 

新建一個asp.net webapplication項目。

項目中加入一個頁面來承載report viewer控件,再加入一個類,裏面封裝方法供rdlc報表使用,此外還需要加入一個rdlc報表定義文件。

image

 

特別說明一下,無論是rdl或者rdlc在asp.net和winform程序中都可以通過report viewer控件集成進來的。

還需要填加一個引用,adome.net,一個類似ado.net的類,不同的sqlserver有不同的版本,針對sqlserver2012,版本爲11。如果是默認安裝的話那麼可以在如下目錄中找到這個要引用的dll。

C:\Program Files\Microsoft.NET\ADOMD.NET\110

image

 

首先定義一個類,這個類跟MDX的返回結果是對應的,針對前面提到的mdx語句,定義如下類。

public class DataItem

{

public string RowTitle { get; set; }

public double Value1 { get; set; }

public double Value2 { get; set; }

}

然後編寫方法,這個方法將作爲後面rdlc報表的數據源。

public static List<DataItem> GetData()

{

List<DataItem> result = new List<DataItem>();

AdomdConnection conn = new AdomdConnection();

conn.ConnectionString = "Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=AdventureWorksDW2012Multidimensional-EE;Data Source=.";

conn.Open();

StringBuilder sbMDX = new StringBuilder();

sbMDX.AppendLine("WITH ");

sbMDX.AppendLine("MEMBER [Measures].[Sale Amount Ratio] AS '[Measures].[Internet Sales Amount]/([Measures].[Internet Sales Amount], [Product].[Product Categories].[All])' , FORMAT_STRING = '0.00%' ");

sbMDX.AppendLine("SELECT ");

sbMDX.AppendLine("{[Measures].[Internet Sales Amount], [Measures].[Sale Amount Ratio]} ");

sbMDX.AppendLine("ON 0,");

sbMDX.AppendLine("NON EMPTY [Product].[Product Categories].[Product].MEMBERS ");

sbMDX.AppendLine("ON 1");

sbMDX.AppendLine("FROM [Adventure Works]");

AdomdCommand comm = new AdomdCommand();

comm.Connection = conn;

comm.CommandText = sbMDX.ToString();

AdomdDataReader dr = comm.ExecuteReader();

while (dr.Read())

{

DataItem di = new DataItem();

di.RowTitle = dr[0].ToString() +"-"+ dr[1].ToString() +"-"+ dr[2].ToString();

di.Value1 = double.Parse(dr[3].ToString());

di.Value2 = double.Parse(dr[4].ToString());

result.Add(di);

}

return result;

}

}

由於用到了adomd.net對象,所以需要加入如下引用:

using Microsoft.AnalysisServices.AdomdClient;

打開Report.rdlc

image

 

在Report Data中選擇新建-數據集,上面的數據集屬性窗體會被打開,在Data source裏可以找到當前建立的程序命名集空間名稱,選擇它,然後在Avaliable dataset裏就可以看到剛纔建立的方法。選擇它,可以看到數據集的結構。

image

 

接下來簡單設計下這個報表。

image

 

最後回到Default.aspx頁面,加入ReportViewer控件。在Visual Studo 2008之後的版本,還需要填加Script Manager控件。

image

 

在控件裏選擇項目中的報表。可以看到一個ObjectDataSource控件被加到頁面上,Visual Studio會根據報表裏的數據源來自動填加數據源控件。

最後,直接運行項目,就可以看到報表的最終樣式。在rdlc中不像rdl沒有預覽功能,所以只能在承載的頁面裏看報表的結果。

image

 

可以看到MDX的結果被顯示了出來。

關鍵點:

Rdlc可以識別出項目中的方法,以此來作爲其自身的數據源。

承載aspx的頁上,通過ObjectDataSource將類方法映射到rdlc的數據源定義中。

總結:

這種方法相對於rdl或者鏈接服務器的方法,比較繞,但是從另一個角度來說,也有一些優勢。

1. 不需要reporting services承載。

2. 複雜的邏輯可以封裝到c# code中,對於開發複雜報表會容易並且方便調試。

3. 不僅MDX,也適用於挖掘模型以及DMX的查詢。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章