技术开发 频道

在VS2005中使用DrillThrough函数

【IT168技术文档】
   数据仓库、数据挖掘系统的显著优势之一是可以在分析的过程中对某个数据DrillThrough to detail。数据仓库较之普通数据库系统,对数据仓库的查询分析要比数据库快许多,这是因为数据仓库在ETL过程中已经对Integrating的数据源做了各种各样的预先统计处理,并增加了多倍的额外空间保存这些处理结果,才取得了对查询的快速反映优势。这也就是常说的“以空间换时间”。在OLAP分析的时候,也可以使用DrillThrough函数对数据源进行分析。

    DrillThrough函数是MDX常用函数之一,跟通常MDX执行ExecuteCellSet并返回CellSet对象不同的是,使用了DrillThrough关键字的MDX只能ExecuteReader返回DataReader。

    1.   是否允许DrillThrough的权限设置集成在role的“管理角色”中。这点跟AS2000有比较大的区别。在AS2000中,仅对各个cube设置是否允许DrillThrough,所有role具有相同的是否允许DrillThrough的权限;在AS2005中设置更加明细,可以分别对各个role进行是否允许DrillThrough的设置。

     2.   跟AS2000相同的是,DrillThough的对象依然是单个的cell。该cell可以是叶子水平的,也可以是基础度量的聚合cell。所以规定Select部分的每个on axis从句对应的member都是单一的。如:

DRILLTHROUGH select {[Measures].[Internet Sales Amount]} on Axis(0), {[Date].[Calendar].[Month].&[2004]&[3]} on Axis(1), {[Geography].[Geography].[Country].&[ ]} on Axis(2), {[Product].[Product Categories].[Subcategory].[Mountain Bikes]} on Axis(3) FROM [Adventure Works]

 
 或者select从句为空,在where从句指定。上句跟如下语句是等效的:

 DrillThrough select  FROM [Adventure Works]

 WHERE

 (

 [Measures].[Internet Sales Amount],

 [Date].[Calendar].[Month].&[2004]&[3],

  [Geography].[Geography].[Country].&[ ]

 ,[Product].[Product Categories].[Subcategory].[Mountain Bikes]

 ))

 3.        组成上述cell的各个维度都不允许有计算成员。没有做任何限制的维度默认都是defaultMember,如果该defaultMember含有计算成员,必须特别指定其他非计算成员。比如,度量维度的默认成员是计算成员,则必须在select或者where部分特别指定measures的成员([Measures].Members.Item(0)

 4.        DrillThrough跟维度的类型没有关系。如果DrillThrough的是父子关系的层次结构的父成员,则返回的结果将是所有组成该cell的行,包括子成员。

 5.        AS2005新增Return从句以限定返回的列。举个例子:

  

DrillThrough select ( [Measures].[Internet Sales Amount], [Date].[Calendar].[Month].&[2004]&[3], [Geography].[Geography].[Country].&[ ] , [Product].[Product Categories].[Subcategory].[Mountain Bikes] ) on 0 from [Adventure Works] Return [$Date].[Date], KEY([$Product].[Style]), [Internet Sales].[Internet Sales Amount], [Internet Sales].[Internet Tax Amount]

 

public DataTable DrillThrough() { DataTable dt = new DataTable(); string connectionString = "Provider = MSOLAP.3;Data Source=localhost;Initial Catalog=Adventure Works DW"; AdomdConnection acCon = new AdomdConnection(connectionString); try { acCon.Open(); using (AdomdCommand command = new AdomdCommand(@"DrillThrough select FROM [Adventure Works] WHERE ( [Measures].[Internet Sales Amount], [Date].[Calendar].[Month].&[2004]&[3], [Geography].[Geography].[Country].&[United States], [Product].[Product Categories].[Subcategory].[Mountain Bikes]) ", acCon)) { DataTable dt = new DataTable(); using (AdomdDataReader reader = command.ExecuteReader()) { while (reader.Read()) { DataRow dr = dt.NewRow(); for (int i = 0; i < reader.FieldCount; i++) { dr[i] = reader[i]; } dt.Rows.Add(dr); } } } } finally { acCon.Close(); } return dt; }

 

 

 

0
相关文章