無為

          無為則可為,無為則至深!

            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 草兒 閱讀(598) 評論(0)  編輯  收藏 所屬分類: DotNet
          主站蜘蛛池模板: 定安县| 辛集市| 老河口市| 河南省| 新乡市| 舟山市| 马尔康县| 石柱| 全椒县| 辉县市| 宁南县| 呈贡县| 苗栗县| 象山县| 鹤山市| 永川市| 云和县| 缙云县| 固安县| 昂仁县| 清流县| 玉龙| 甘孜县| 鸡东县| 宜川县| 兰西县| 黑水县| 肇源县| 永州市| 邯郸市| 桂东县| 扎囊县| 淮南市| 唐河县| 离岛区| 石家庄市| 齐齐哈尔市| 满城县| 淮安市| 辽源市| 灌云县|