ADOMD.NET中同样有Connection、Command、等这些在ADO.NET中常见的对象,只是名字稍有不同。在ADOMD.NET中这些对象名称是AdomdConnect、AdomdCommand、AdomdParameter、 AdomdDataReader及CellSet等。下面分别介绍这些API。
AdomdConnection:多维数据集连接对象,通过字符类型的连接信息与AS建立通信关系。
AdomdCommand:多维数据集命令对象,用于执行MDX,DMX或SQL查询。AdomdCommand对象可以返回CellSet或AdomdDataReader对象。也可以接收参数化查询。AdomdCommand执行的查询命令文本通常都比较短,但是如果遇到有比较长的查询命令文本可以使用AdomdCommand的CommandStream来存放命令。CommandText和CommandStream属性不能同时设置。AdomdCommand也可以通过XMLA来执行一些DDL语句,也就是说可以将XMLA作为命令文本。而XMLA是使用的XML格式,ADOMD.NET是通过第一个字符来判断命令中是XML数据还是普通文本的,如果第一个字符是“<”,则认为是XML数据,即XMLA形式的命令,反之则是普通文本形式的命令。
AdomdParameter: 多维数据集参数对象,用于参数化的MDX查询。
CellSet:MDX查询返回的数据集,与DataSet不一样,这个对象存放的是多维数据,存放到其中的数据通过坐标轴以及每个维度的层次、元组及元组成员表示,在这个对象中包含所有的多维数据结构信息。CellSet是多维数据操作中的一个非常重要的对象。
AdomdDataReader:多维数据集数据读取器对象。这也是用于从多维数据集获取数据的一个非常重要的接口。很多时候我们需要把从多维数据集获取的多维数据展现到一个二维数据表中,当然这里可以使用CellSet对象,不过使用CellSet对象相对比较复杂,因为我们要熟悉得到的多维数据结构,还要根据这个结构来解析,最后按照解析的结构来手动地构造一个二维数据表。最后把度量数据填充到表格中。但是使用AdomdDataReader就不一样了,AdomdDataReader可以直接得到已经平展化的数据。通过一次遍历就可以输出MDX的结果。但是使用AdomdDataReader来输出MDX查询结果不能保持多维数据集的多维特性,而且整个命令执行过程中是与数据源保持连接的。因此,选择使用CellSet还是AdomdDataReader对象有点类似于DataSet与DataReader之间的比较。CellSet适用于相对少量的非持久连接的多维结构数据。相反,AdomdDataReader更适用于相对大量的持久连接的平展数据。也即,如果只想用于在客户端展示数据内容可以选择AdomdDataReader,而想得到MDX结果集的维度及层次等结构信息则要用CellSet对象。如果选择依赖实际应用。
Axis:坐标轴(维)对象,坐标轴(维)对象包括若干层次及若干元组,每个元组包括多个成员。通常情况下坐标轴(维)的层次数等于每个元组的成员个数。
CellCollection:度量值集合。多维数据集中除了维度之外还有度量数据,这些数据都存放在CellCollection对象中。所有的度量数据都是按一维数组的方式存放在这个集合对象中的。
下面通过一段简单的代码说明如何通过代码来访问多维数据集:
//MDX查询语句
string mdxQuery = @"SELECT NON EMPTY
{
[Measures].[Store Cost] ,
[Measures].[Store Sales]
} ON COLUMNS,
NON EMPTY
{
( [Product Local].[Product Local].[Product Local].ALLMEMBERS *
[Product Local].[Product Class Local].[Product Class Local].ALLMEMBERS *
[Product Local].[Product Category].[Product Category].ALLMEMBERS *
[Time By Day Local].[the_month].[the_month].ALLMEMBERS
) } DIMENSION PROPERTIES MEMBER_CAPTION, MEMBER_UNIQUE_NAME ON ROWS
FROM [Foodmart Sale DW] ";
//实例化连接对象
AdomdConnection conn =new AdomdConnection(@"Provider=MSOLAP;Data Source=.;Integrated Security=SSPI; Initial Catalog=FoodmartsaleAS");
//实例化多维数据集命令对象
AdomdCommand comm = new AdomdCommand(mdxQuery, conn);
conn.Open();
CellSet cs = comm.ExecuteCellSet(); //取得多维数据集数据
//TODO:按多维结构访问CellSet对象