1 ADOMD.NET結構
ADOMD.NET是一個標準的.NET數據提供者,它主要用來與多維數據源進行通信。它使用 XML for Analysis version1.1標準的數據提供者連接數據源,使用TCP/IP或HTTP流傳輸和接受SOAP請求[1]。ADOMD.NET它提供了一種編程的方法來訪問Analysis Services服務器,有了ADOMD.NET,客戶應用程序可以查詢Analysis Services服務器上的數據,還可以查看或操作Analysis Services數據庫上的結構。ADOMD.NET包含如下對象:
(1)AdomdConnection
AdomdConnection管理客戶端應用程序與多維數據服務器之間的連接,連接字符串形式與下類似:
DataSource=serverName;Catalog=AnalSvcsDB;Provider=msolap;
(2)AdomdCommand
AdomdCommand管理多維服務器上查詢語句的執行。查詢語句只能為CommandText或CommandStream屬性,且必須是目標服務器上有效的MDX命令或者與XML/A兼容的命令。
AdomdCommand提供下面的方法來執行查詢語句:
Execute:返回CellSet或AdomdDataReader對象。
ExecuteCellSet:返回CellSet對象。
ExecuteNonQuery:執行不返回結果的命令。
ExecuteReader:返回AdomdDataReader對象。
ExecuteXMLReader:返回XML/A格式對象,它可以使用XMLReader查看。
(3)AdomdDataReader
AdomdDataReader提供了一種從查詢中讀取只向前(forward-only)結果集的方法,讀取結果集時,客戶端應用程序與數據源必須保持連接狀態,它要求更多的服務器開銷。
(4)CellSet
與AdomdDataReader不同,CellSet利用了一種斷開連接的結果集,它包含多維結果集的整個結構。應用程序不用與服務器保持連接就可以與結果集進行交互。
CellSet含有AXIS、SET、TUPLE、MEMBER等對象。
AXIS:軸是MDX查詢中描述維度的概念,代表查詢維度:列、行、頁等,維的集合分為Axis維和Slicer維,Axis維決定多維結果集的邊,Slicer維用來過濾多維數據。
SET:是任意個TUPLE的集合,在MDX查詢中經常用來定義軸維和切片維。
TUPLE:用來定義立方體數據的一個切片,它由一個或多個維中的MEMBER集合組成。
MEMBER:是維中的一個條目,用于描述立方體中的單元數據。
CellS單元集:CellSet還包含一個叫CellS的單元集,CellS還有MDX查詢中的度量,CellSet中,獨立單元的度量通過Values屬性來訪問,如:CellSet.Cells(X,Y,Z).Value。
2 MDX
多維表達式MDX(Multi-Dimensional Expressions)在功能上類似于關系數據庫查詢語言SQL,是一種操縱Analysis Services多維信息的語言。MDX語句可分為數據定義和數據查詢兩種類型。數據定義主要用來定義多維結構和對象(如立方體、維度等),就像使用SQL語句可以定義視圖和表等對象一樣[2]。
多維表達式(MDX)查詢采用如下方式進行構造[2]:
[WITH
SELECT[
FROM[
[WHERE[
WITH語句:命名集,為可選項,當MDX中的集長而復雜、維護時冗長且難處理時,用戶可創建命名集來提高易懂性。
SELECT語句:用來選擇維度和成員,稱之為“軸維度”。允許用戶指定128個軸,前5個分別用COLUMNS,ROWS,PAGES,SECTIONS和CHAPTERS表示,后面的軸用數字來表示,一般情況下,用戶不會使用超過5個以上的軸。
FROM:決定MDX查詢的多維數據集,由單個多維數據集的名稱完成,通常不允許連接。但用戶可以使用LookupCube函數從多維數據集以外的多維數據集檢索數據。
WHERE語句:為可選項,用來將返回的數據限定為特定維度和成員條件,稱之為“切片維度”,切片維只能有一個。
3 用ADOMD.NET訪問多維數據集應用實例
3.1 開發環境
硬件平臺:主頻2.3G,內存1G,64位雙核處理器
操作系統:Windows 2003 server
數據庫:SQL Server 2005 數據庫引擎
應用平臺:SQL Server 2005 分析服務
開發平臺:Visual Studio 2005
3.2 需求分析
創建一個的簡單應用程序,訪問SQL Server 2005分析服務器上的多維數據集,顯示電信商業客戶分析系統中針對不同類型的客戶,在不同銷售區域,各類產品的話費收入情況。
3.3 部分代碼實現
(1)連接OLAP服務器
通過 Imports Microsoft.AnalysisServices.AdomdClient添加對AdomdClient引用
//連接服務器
Conn = new AdomdConnection("provider=msolap;Data Source=StrServer ;Catalog =StrDatabase;");
Conn.Open();
(2)執行MDX查詢
strMdxQuery ="SELECT [Dim Channels].[Channels Name].members on pages, " &_
" [Dim Area].[Area Name].Members on rows, " &_
" [Dim Product].[Product Name].Members on columns, "&_
"FROM [SalesDM] "&_
"WHERE [measures].[SalesIncome]"
cmd = new AdomdCommand(strMdxQuery, Conn)
cSet = cmd.ExecuteCellSet();
Return cSet ;
(3)解析數據
在三維查看器中解析數據。第一步,循環獲得Axis(2)的內容,即頁維度成員,根據每個成員創建一個選項卡頁面。每個選項卡頁面有一個DataGridView,控制選項卡上行和列的顯示。第二步,循環獲得Axis(0)中的內容,即列維度成員,在DataGridView中創建列,第三步,循環獲得Axis(1)中的內容,即行維度成員,在DataGridView中創建行,最后,獲得CellSet中的單元,將其填充到每個選項卡頁面的DataGridView,部分代碼如下:
//設置頁標題
TabForPages.TabPages.Add(cSet.Axis(2).Set.Tuples(i).Members(0).Caption);
//設置列標題
DataGridViewColumn=new System.Windows.Forms.DataGridViewTextBoxColumn
For j=0 to cSet.Axis(0).Set.Tuples.Count-1
DataGridViewColumn.HeaderText=cSet.Axis(0).Set.
Tuples(j).Members(0).Caption
DataGridViewColumn.Add(DataGridViewColumn)
//設置行標題
DataGridView.RowCount=cSet.Axis(1).Set.Tuples.Count
For k=0 to cSet.Axis(1).Set.Tuples.Count-1
DataGridView.Rows(k).HeaderCell.Value=cSet.Axis(1).Set.Tuples(k).Members(0).Caption
//將CellSet中的單元值填充到每個選項卡頁面的DataGridView
For j=0 to cSet.Axis(0).Set.Tuples.Count-1
For k=0 to cSet.Axis(1).Set.Tuples.Count-1
DataGridView(j,k).Value=cSet.Cells(j,k,i).Value
//循環填充每頁數據
For i=0 to cSet.Axis(2).Set.Tuples.Count-1
TabForPages.TabPages(i).Controls.Add(DataGridView)
3.4 結果分析
需求中有客戶類型、銷售區域、產品三個維度,在實例中客戶類型用頁選項卡顯示,產品、銷售區域用列、行顯示,話費收入為度量值,實踐證明,用ADOMD.NET技術能很好的把MDX查詢結果與應用程序結合起來。
參考文獻
[1]王彩.基于數據倉庫和OLAP技術的故障分析應用研究[D].西安交通大學碩士學位論文.2007.05
[2]黃金釵.OLAP中查詢優化以及多維數據模型研究[D].湖南大學碩士學位論文.2009.04
作者簡介:
許小紅(1979-),女,漢,江西萬安人,碩士,主要從事信息安全與數據挖掘方面的研究。