无为

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

  语源科技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 草儿 阅读(640) 评论(0)  编辑  收藏 所属分类: DotNet