一、前言
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ù)。
二、目標
查詢分析服務(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 = new DataTable();
DataColumn dc = new DataColumn();
DataRow dr = null;
//第一列:必有為維度描述(行頭)
dt.Columns.Add(new DataColumn("Descr //生成數(shù)據(jù)列對象 string name; foreach (Position p in cs.Axes[0].Positions) { dc = new DataColumn(); 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 = new SqlAnalysisService("Data Source=localhost;Catalog=LibraryStat"); protected void Page_Load(object sender, EventArgs e) { StringBuilder sb=new StringBuilder(); 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.dll(Microsoft SQL Server 2005為9.0版;Microsoft SQL Server 2000為8.0版) 有AdomdClient當(dāng)然有AdomdServer,分析服務(wù)也包含了存儲過程和CLR的存儲過程。 五、后記 l 在微軟推出Microsoft SQL Server 2005之后,微軟又為分析服務(wù)提供了多種訪問方式。 下次有時間講講如何定時從SQL 2005更新數(shù)據(jù)到分析服務(wù)。
命名空間:Microsoft.AnalysisServices.AdomdClient
l 理論上本例也可以在Microsoft SQL Server 2000下運行。但是我的同事在WebForm下應(yīng)用時出現(xiàn)錯誤。
新聞熱點
疑難解答