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