一、前言
1 、運(yùn)行環(huán)境
Windows 2003 Server
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)載請注明來處和原文作者。非常感謝。