程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 從RDLC中讀取Analysis Services中Cube的數據

從RDLC中讀取Analysis Services中Cube的數據

編輯:關於.NET

在微軟的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的查詢。

查看本欄目

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