一、前言
1 、運行環境
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 訪問分析服務。
二、目標
查詢分析服務數據轉換為 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(草兒)原創,凡是索引、收藏
、轉載請注明來處和原文作者。非常感謝。