一、前言
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(草儿)原创,凡是索引、收藏
、转载请注明来处和原文作者。非常感谢。