無(wú)為

          無(wú)為則可為,無(wú)為則至深!

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            190 Posts :: 291 Stories :: 258 Comments :: 0 Trackbacks

          一、前言

          1 、運(yùn)行環(huán)境

          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 訪問(wèn)分析服務(wù)。

          二、目標(biāo)

          查詢分析服務(wù)數(shù)據(jù)轉(zhuǎn)換為 DataTable 形式,在 GridView 中顯示。

          三、實(shí)現(xiàn)

          通過(guò) Adomd .NET 訪問(wèn)分析服務(wù)。通過(guò) MDX 查詢語(yǔ)言查詢數(shù)據(jù)。

          1、? ADO .NET 一樣, ADOMD .NET 也主要有在線數(shù)據(jù)讀取器 AdomdDataReader 和離線數(shù)據(jù)集 ( 類似 DataSet ) CellSet

          2、? 訪問(wèn)數(shù)據(jù)的步驟為:建立連接 -> 打開連接 -> 建立 AdomdCommand -> 得到 CellSet -> 關(guān)閉連接 -> CellSet 轉(zhuǎn)化為 DataTable 或?qū)?shù)據(jù)綁定到對(duì)應(yīng)的餅圖等統(tǒng)計(jì)圖控件

          3、? 代碼片斷

          l???????? 打開連接,連接到分析服務(wù)

          ??????? public void OpenConnection()

          ??????? {

          ??????????? if (_connection != null)

          ??????????????? if (_connection.State == ConnectionState.Closed)

          ??????????????????? _connection.Open();

          ??????? }

          l????????? 獲得 CellSet 數(shù)據(jù)對(duì)象

          ??????? public CellSet ExecuteCellSet(string queryString)

          ??????? {

          ??????????? OpenConnection();

          ?

          ??????????? AdomdCommand command = _connection.CreateCommand();

          ?

          ??????????? command.CommandText = queryString;

          ???????????

          ??????????? CellSet cellSet = command.ExecuteCellSet();

          ???????????

          ??????????? CloseConnection();

          ?

          ??????????? return cellSet;

          ??????? }

          l????????? CellSet 數(shù)據(jù)對(duì)象轉(zhuǎn)換為 DataTable 對(duì)象

          ??????? public DataTable ToDataTable(CellSet cs)

          ??????? {

          ??????????? DataTable dt = newDataTable();

          ??????????? DataColumn dc = newDataColumn();

          ??????????? DataRow dr = null;

          ?

          ??????????? // 第一列:必有為維度描述(行頭)

          ??????????? dt.Columns.Add(newDataColumn("Description"));

          ?

          ??????????? // 生成數(shù)據(jù)列對(duì)象

          ??????????? 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);

          ??????????? }

          ?

          ??????????? // 添加行數(shù)據(jù)

          ??????????? int pos = 0;

          ?

          ??????????? foreach (Position py in cs.Axes[1].Positions)

          ??????????? {

          ??????????????? dr = dt.NewRow();

          ?

          ??????????????? // 維度描述列數(shù)據(jù)(行頭)

          ??????????????? name = "";

          ??????????????? foreach (Member m in py.Members)

          ?????????? ?????{

          ??????????????????? name = name + m.Caption + "\r\n";

          ??????????????? }

          ??????????????? dr[0] = name;

          ?

          ??????????????? // 數(shù)據(jù)列

          ??????????????? for (int x = 1; x <= cs.Axes[0].Positions.Count; x++)

          ??????????????? {

          ??????????????????? dr[x] = cs[pos++].FormattedValue;

          ??????????????? }

          ?

          ??????????????? dt.Rows.Add(dr);

          ??????????? }

          ?

          ??????????? return dt;

          ??????? }

          5 、程序調(diào)用

          ??? 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 '[ 圖書分銷 訂單].[層次結(jié)構(gòu)].[單位].[安徽大學(xué)???? 圖書館].Children'" );

          ??????? sb.Append(" Member [ 圖書分銷 訂單].[層次結(jié)構(gòu)].[單位].[安徽大學(xué)???? 圖書館].[合計(jì)] as 'aggregate([AllCount])'" );

          ??????? sb.Append(" Member [ 所占訂單數(shù)百分比] as '[訂單數(shù)量]/([訂單數(shù)量],[圖書分銷 訂單].[層次結(jié)構(gòu)].[單位].[安徽大學(xué)???? 圖書館].[合計(jì)])',format_string='#.00%'" );

          ??????? sb.Append(" select {[Measures].[ 訂單數(shù)量],[Measures].[儲(chǔ)運(yùn)數(shù)量],[Measures].[原始數(shù)量],[所占訂單數(shù)百分比]} on columns," );

          ??????? sb.Append(" {[ 圖書分銷 訂單].[層次結(jié)構(gòu)].[單位].[安徽大學(xué)???? 圖書館].Children} on rows" );

          ??????? sb.Append(" from [ 圖書館統(tǒng)計(jì)]" );

          ?

          ??????? DataTable dt = sa.GetDataTable(sb.ToString());

          ?

          ??????? gv.DataSource = dt;

          ??????? gv.DataBind();

          ??? }

          gv 為一個(gè) GridView 對(duì)象。除了查詢語(yǔ)句不同,數(shù)據(jù)綁定是一樣的,因?yàn)橐呀?jīng)轉(zhuǎn)換為 DataTable 了。

          四、備注

          命名空間: Microsoft.AnalysisServices.AdomdClient

          程序集文件: Microsoft.AnalysisServices.AdomdClient.dll Microsoft SQL Server 2005 9.0 版; Microsoft SQL Server 2000 8.0 版)

          AdomdClient 當(dāng)然有 AdomdServer ,分析服務(wù)也包含了存儲(chǔ)過(guò)程和 CLR 的存儲(chǔ)過(guò)程。

          五、后記

          l???????? 理論上本例也可以在 Microsoft SQL Server 2000 下運(yùn)行。但是我的同事在 WebForm 下應(yīng)用時(shí)出現(xiàn)錯(cuò)誤。

          l???????? 在微軟推出 Microsoft SQL Server 2005 之后,微軟又為分析服務(wù)提供了多種訪問(wèn)方式。



          凡是有該標(biāo)志的文章,都是該blog博主Caoer(草兒)原創(chuàng),凡是索引、收藏
          、轉(zhuǎn)載請(qǐng)注明來(lái)處和原文作者。非常感謝。

          posted on 2006-06-10 13:19 草兒 閱讀(601) 評(píng)論(0)  編輯  收藏 所屬分類: DotNet
          主站蜘蛛池模板: 封开县| 呼图壁县| 库尔勒市| 城口县| 嘉义市| 福海县| 祥云县| 蒙阴县| 沧源| 天等县| 常州市| 扶沟县| 城步| 健康| 衡阳县| 永州市| 晋宁县| 麦盖提县| 太原市| 大洼县| 明光市| 张北县| 临漳县| 尼勒克县| 宾川县| 涡阳县| 金门县| 娱乐| 潮州市| 阿鲁科尔沁旗| 章丘市| 南乐县| 南华县| 东海县| 哈巴河县| 枝江市| 南木林县| 阿拉善左旗| 嘉黎县| 清水河县| 宁阳县|