一、前言
1
、運行環(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
中顯示。
三、實現(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)計圖控件
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é)???? 圖書館].[合計] as 'aggregate([AllCount])'"
);
??????? sb.Append(" Member [
所占訂單數(shù)百分比] as '[訂單數(shù)量]/([訂單數(shù)量],[圖書分銷 訂單].[層次結(jié)構(gòu)].[單位].[安徽大學(xué)???? 圖書館].[合計])',format_string='#.00%'"
);
??????? sb.Append(" select {[Measures].[
訂單數(shù)量],[Measures].[儲運數(shù)量],[Measures].[原始數(shù)量],[所占訂單數(shù)百分比]} on columns,"
);
??????? sb.Append(" {[
圖書分銷 訂單].[層次結(jié)構(gòu)].[單位].[安徽大學(xué)???? 圖書館].Children} on rows"
);
??????? sb.Append(" from [
圖書館統(tǒng)計]"
);
?
???????
DataTable dt = sa.GetDataTable(sb.ToString());
?
??????? gv.DataSource = dt;
??????? gv.DataBind();
??? }
gv
為一個
GridView
對象。除了查詢語句不同,數(shù)據(jù)綁定是一樣的,因為已經(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
下運行。但是我的同事在
WebForm
下應(yīng)用時出現(xiàn)錯誤。
l????????
在微軟推出
Microsoft SQL Server 2005
之后,微軟又為分析服務(wù)提供了多種訪問方式。
凡是有該標(biāo)志的文章,都是該blog博主Caoer(草兒)原創(chuàng),凡是索引、收藏
、轉(zhuǎn)載請注明來處和原文作者。非常感謝。