無為

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

            BlogJava :: 首頁 :: 聯(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ù)。

          二、目標(biāo)

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

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

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

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

          2、? 訪問數(shù)據(jù)的步驟為:建立連接 -> 打開連接 -> 建立 AdomdCommand -> 得到 CellSet -> 關(guān)閉連接 -> CellSet 轉(zhuǎn)化為 DataTable 或?qū)?shù)據(jù)綁定到對應(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ù)對象

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

          ??????? {

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

          ?

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

          ?

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

          ???????????

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

          ???????????

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

          ?

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

          ??????? }

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

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

          ??????? {

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

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

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

          ?

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

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

          ?

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

          ??????????? 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].[儲運(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 為一個 GridView 對象。除了查詢語句不同,數(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ù)也包含了存儲過程和 CLR 的存儲過程。

          五、后記

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

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



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

          posted on 2006-06-10 13:19 草兒 閱讀(601) 評論(0)  編輯  收藏 所屬分類: DotNet
          主站蜘蛛池模板: 东兰县| 湖南省| 宁远县| 庆云县| 长泰县| 元阳县| 巴林右旗| 安阳市| 龙门县| 宜兰县| 鹤岗市| 遂宁市| 连平县| 龙川县| 宁远县| 襄樊市| 遂川县| 新乐市| 永平县| 威信县| 上饶县| 昌平区| 娱乐| 班戈县| 桂林市| 延庆县| 昭平县| 翼城县| 合江县| 承德市| 商城县| 海原县| 沧州市| 玉环县| 尖扎县| 辽中县| 华安县| 常山县| 南雄市| 偃师市| 漯河市|