用ADOMD.NET访问OLAP多维数据集的应用研究
2011-09-22许小红
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-),女,汉,江西万安人,硕士,主要从事信息安全与数据挖掘方面的研究。