一、前言
		
		
				1
				、运行环境
		
		
				Windows 2003 Server Enterprise Edition with Service Pack 1
		
		
				Microsoft SQL Server 2005 with Service Pack 1(
				包含
				Analysis Service)
		
		
				Visual Studio 2005 Team Suite
		
		
				2
				、本文使用
				Microsoft SQL Server 2000
				下也可使用的
				ADOMD .NET
				访问分析服务。
		
		
				二、目标
		
		
				查询分析服务数据转换为
				DataTable
				形式,在
				GridView
				中显示。
		
		
				三、实现
		
		
				通过
				Adomd .NET
				访问分析服务。通过
				MDX
				查询语言查询数据。
		
		
				
						1、  
				
				同
				ADO .NET
				一样,
				ADOMD .NET
				也主要有在线数据读取器
				AdomdDataReader
				和离线数据集
				(
				类似
				DataSet
				)
				 CellSet
		
		
				
						2、  
				
				访问数据的步骤为:建立连接
				->
				打开连接
				->
				建立
				AdomdCommand
				 ->
				得到
				CellSet
				->
				关闭连接
				->
				将
				CellSet
				转化为
				DataTable
				或将数据绑定到对应的饼图等统计图控件
		
		
				
						3、  
				
				代码片断
		
		
				
						l         
				
				打开连接,连接到分析服务
		
		
				
						        
						public
						void OpenConnection()
		
		
				
						        {
		
		
				
						            
						if (_connection != null)
		
		
				
						                
						if (_connection.State == ConnectionState.Closed)
		
		
				
						                    _connection.Open();
		
		
				
						        }
		
		
				
						l          
				
				获得
				CellSet
				数据对象
				
						
						
				
		
		
				
						        
						public
						CellSet ExecuteCellSet(string queryString)
		
		
				
						        {
		
		
				
						            OpenConnection();
		
		
				
						 
				
		
		
				
						            
						AdomdCommand command = _connection.CreateCommand();
		
		
				
						 
				
		
		
				
						            command.CommandText = queryString;
		
		
				
						            
						
						
				
		
		
				
						            
						CellSet cellSet = command.ExecuteCellSet();
		
		
				
						            
						
						
				
		
		
				
						            CloseConnection();
		
		
				
						 
				
		
		
				
						            
						return cellSet;
		
		
				
						        }
		
		
				
						l          
				
				将
				CellSet
				数据对象转换为
				DataTable
				对象
				
						
						
				
		
		
				
						        
						public
						DataTable ToDataTable(CellSet cs)
		
		
				
						        {
		
		
				
						            
						DataTable dt = newDataTable();
		
		
				
						            
						DataColumn dc = newDataColumn();
		
		
				
						            
						DataRow dr = null;
		
		
				
						 
				
		
		
				
						            
						//
				
				第一列:必有为维度描述(行头)
		
		
				
						            dt.Columns.Add(newDataColumn("Description"));
		
		
				
						 
				
		
		
				
						            
						//
				
				生成数据列对象
		
		
				
						            
						string name;
		
		
				
						 
				
		
		
				
						            
						foreach (Position p in cs.Axes[0].Positions)
		
		
				
						            {
		
		
				
						                dc = newDataColumn();
		
		
				
						                name = "";
		
		
				
						                
						foreach (Member m in p.Members)
		
		
				
						                {
		
		
				
						                    name = name + m.Caption + " ";
		
		
				
						                }
		
		
				
						 
				
		
		
				
						                dc.ColumnName = name;
		
		
				
						                dt.Columns.Add(dc);
		
		
				
						            }
		
		
				
						 
				
		
		
				
						            
						//
				
				添加行数据
		
		
				
						            
						int pos = 0;
		
		
				
						 
				
		
		
				
						            
						foreach (Position py in cs.Axes[1].Positions)
		
		
				
						            {
		
		
				
						                dr = dt.NewRow();
		
		
				
						 
				
		
		
				
						                
						//
				
				维度描述列数据(行头)
		
		
				
						                name = "";
		
		
				
						                
						foreach (Member m in py.Members)
		
		
				
						           
						     {
		
		
				
						                    name = name + m.Caption + "\r\n";
		
		
				
						                }
		
		
				
						                dr[0] = name;
		
		
				
						 
				
		
		
				
						                
						//
				
				数据列
		
		
				
						                
						for (int x = 1; x <= cs.Axes[0].Positions.Count; x++)
		
		
				
						                {
		
		
				
						                    dr[x] = cs[pos++].FormattedValue;
		
		
				
						                }
		
		
				
						 
				
		
		
				
						                dt.Rows.Add(dr);
		
		
				
						            }
		
		
				
						 
				
		
		
				
						            
						return dt;
		
		
				
						        }
		
		
				5
				、程序调用
		
		
				
						    BaseComponent.Data.SqlAnalysisService sa 
		
		
				
						        = newSqlAnalysisService("Data Source=localhost;Catalog=LibraryStat");
		
		
				
						 
				
		
		
				
						    
						protected
						void Page_Load(object sender, EventArgs e)
		
		
				
						    {
		
		
				
						        
						StringBuilder sb=newStringBuilder();
		
		
				
						 
				
		
		
				
						        sb.Append("with ");
		
		
				
						        sb.Append(" set [AllCount] as '[
				图书分销 订单].[层次结构].[单位].[安徽大学     图书馆].Children'"
				);
		
		
				
						        sb.Append(" Member [
				图书分销 订单].[层次结构].[单位].[安徽大学     图书馆].[合计] as 'aggregate([AllCount])'"
				);
		
		
				
						        sb.Append(" Member [
				所占订单数百分比] as '[订单数量]/([订单数量],[图书分销 订单].[层次结构].[单位].[安徽大学     图书馆].[合计])',format_string='#.00%'"
				);
		
		
				
						        sb.Append(" select {[Measures].[
				订单数量],[Measures].[储运数量],[Measures].[原始数量],[所占订单数百分比]} on columns,"
				);
		
		
				
						        sb.Append(" {[
				图书分销 订单].[层次结构].[单位].[安徽大学     图书馆].Children} on rows"
				);
		
		
				
						        sb.Append(" from [
				图书馆统计]"
				);
		
		
				
						 
				
		
		
				
						        
						DataTable dt = sa.GetDataTable(sb.ToString());
		
		
				
						 
				
		
		
				
						        gv.DataSource = dt;
		
		
				
						        gv.DataBind();
		
		
				
						    }
		
		
				gv
				为一个
				GridView
				对象。除了查询语句不同,数据绑定是一样的,因为已经转换为
				DataTable
				了。
		
		
				四、备注
		
		
				命名空间:
				Microsoft.AnalysisServices.AdomdClient
		
		
				程序集文件:
				Microsoft.AnalysisServices.AdomdClient.dll
				(
				Microsoft SQL Server 2005
				为
				9.0
				版;
				Microsoft SQL Server 2000
				为
				8.0
				版)
		
		
				有
				AdomdClient
				当然有
				AdomdServer
				,分析服务也包含了存储过程和
				CLR
				的存储过程。
		
		
				五、后记
		
		
				
						l         
				
				理论上本例也可以在
				Microsoft SQL Server 2000
				下运行。但是我的同事在
				WebForm
				下应用时出现错误。
		
		
				
						l         
				
				在微软推出
				Microsoft SQL Server 2005
				之后,微软又为分析服务提供了多种访问方式。
		
凡是有该标志的文章,都是该blog博主Caoer(草儿)原创,凡是索引、收藏
、转载请注明来处和原文作者。非常感谢。