无为

无为则可为,无为则至深!

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  190 Posts :: 291 Stories :: 258 Comments :: 0 Trackbacks

一、前言

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

posted on 2006-06-10 13:19 草儿 阅读(518) 评论(0)  编辑  收藏 所属分类: DotNet

只有注册用户登录后才能发表评论。


网站导航: