在微軟的Report Services的rdl中,默認是支持從分許服務的Cube中查詢數據的,但是 rdlc中就需要間接的方式來對Cube的數據進行訪問。
相對rdl和rdlc兩者完全就是不同的 套路。兩者的差別絕對不是名字上只差個c那麼簡單,從設計的部分細節和部署的方式都有很 大的區別。而實際項目中往往根據不同的情況來具體決定才用哪一種方案。
這裡推 薦用兩種方式來訪問。
第一種方式是用鏈接的形式將分析服務數據庫鏈接到數據引 擎服務,然後mdx查詢的邏輯寫到存儲過程裡,最後頂層應用通過調用存儲過程的方式來間接 達到訪問分析服務數據庫的目的。
另外一種方案就是將數據源用方法封裝起來。由於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數據庫,這兩個庫在結構上有很大的差別,不要下載錯。
首先將下載下來的數據庫文件附加進數據引擎服務。
打開SSAS腳本文件。
可以看到 VS2010設計器被打開。(話說等這個等了好久。。。)
如果你有裝VS2012,這裡需 要右鍵選擇用VS2010來打開。
右鍵項目,處理一下SSAS數據庫。
處理過程跟先前的版本沒什麼大的區別。
接下來,假如我們要在rdlc中顯示如下的mdx語句的查詢結果。
RDLC中讀取 Analysis Services中Cube的數據
新建一個asp.net webapplication項目。
項目中加入一個頁面來承載report viewer控件,再加入一個類,裡面封裝方法供rdlc報表使用,此外還需要加入一個rdlc報表 定義文件。
特別說明一下 ,無論是rdl或者rdlc在asp.net和winform程序中都可以通過report viewer控件集成進來的 。
還需要填加一個引用,adome.net,一個類似ado.net的類,不同的sqlserver有不 同的版本,針對sqlserver2012,版本為11。如果是默認安裝的話那麼可以在如下目錄中找到 這個要引用的dll。
C:\Program Files\Microsoft.NET\ADOMD.NET\110
首先定義一個類,這個類跟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
在Report Data中選擇新建-數據集,上面的數據集屬性窗體會被打開,在Data source裡 可以找到當前建立的程序命名集空間名稱,選擇它,然後在Avaliable dataset裡就可以看到 剛才建立的方法。選擇它,可以看到數據集的結構。
接下來簡單設計下這個報表。
最後回到Default.aspx頁面,加入ReportViewer控件。在Visual Studo 2008之後的版本 ,還需要填加Script Manager控件。
在控件裡選擇項目中的報表。可以看到一個ObjectDataSource控件被加到頁面上,Visual Studio會根據報表裡的數據源來自動填加數據源控件。
最後,直接運行項目,就可 以看到報表的最終樣式。在rdlc中不像rdl沒有預覽功能,所以只能在承載的頁面裡看報表的 結果。
可以看到MDX的結果被顯示了出來。
關鍵點:
Rdlc可以識別出項目中的 方法,以此來作為其自身的數據源。
承載aspx的頁上,通過ObjectDataSource將類 方法映射到rdlc的數據源定義中。
總結:
這種方法相對於rdl或者鏈接服務 器的方法,比較繞,但是從另一個角度來說,也有一些優勢。
1. 不需要reporting services承載。
2. 復雜的邏輯可以封裝到c# code中,對於開發復雜報表會容易並 且方便調試。
3. 不僅MDX,也適用於挖掘模型以及DMX的查詢。
查看本欄目