本文內容
1. ADOMD。NET查詢Analysis Servies中Cube
2. 把查詢返回來的資料格集合轉化為DataTable
查詢內容:
2004年四個季度的分銷商配額與銷售額,所對應的MDX
select
{[Measures].[Reseller Sales-Sales Amount] ,[Measures].[Sales Amount
Quota] } on columns, {[Date].[Fiscal Quarter].Members} on rows
from [Analysis Services Tutorial]
where [Date].[Fiscal Year].&[2004]"
資料集:線上說明文檔內建教程完成第七課後,布署後的CubeAnalysis Services Tutorial
查詢軸:
列軸:分銷商配額與銷售額對應的度量值[Measures].[Reseller Sales-Sales Amount] ,[Measures].[Sales Amount Quota]
行軸:時間維度的季度所有成員[Fiscal Quarter].Members
切片軸:時間維度中年份層級中的2004年面員
資料結構的轉化
ADOMD.NET查詢返回的儲存格集合CellSet的資訊其中包插查詢軸(列軸與行軸)和度量值集合(一),但用戶端應用程式顯示資料需要表的資料結構,列與行組成.資料結構的轉化細節請看代碼中的注釋.
(圖一)
(圖2)
代碼:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.AnalysisServices.AdomdClient;
namespace winAl
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public void Adomd()
{
//串連的字串
string conStr = "provider=msolap ;Integrated Security =SSPI ;Data Source= localhost ;Catalog =Analysis Services Tutorial ;";
//建立個連線物件
AdomdConnection con = new AdomdConnection();
con.ConnectionString = conStr;
con.Open();
// 建立個命令
AdomdCommand cmm =con.CreateCommand();
cmm.CommandText = @" select {[Measures].[Reseller Sales-Sales Amount] ,[Measures].[Sales Amount Quota] } on columns,
{[Date].[Fiscal Quarter].Members} on rows
from [Analysis Services Tutorial]
where [Date].[Fiscal Year].&[2004]";
//執行命令返回資料格集合
CellSet result = cmm.ExecuteCellSet();
this.dataGridView1.DataSource = CellSetToTable(result);
con.Close();
}
private DataTable CellSetToTable(CellSet cellset)
{
DataTable table = new DataTable("cellset");
Axis columns=cellset.Axes[0] ;//擷取列軸
Axis rows=cellset.Axes[1] ; //擷取行軸
CellCollection valuesCell = cellset.Cells;//擷取度量值資料格集合
//行軸的層級標題為表的第一列
table.Columns.Add(rows.Set.Hierarchies[0].Caption);
//行軸的成各個成員的標題變成表的列
for(int i=0 ;i<columns.Set.Tuples.Count ;i++)
{
table.Columns.Add(new DataColumn(columns.Set.Tuples[i].Members[0].Caption)) ;
}
int valuesIndex=0;
DataRow row = null;
//向表中填充資料
for (int i = 0; i < rows.Set.Tuples.Count;i++ )
{
row = table.NewRow();
//表所有行的第一列值為相應行軸的成標題
row[0] = rows.Set.Tuples[i].Members[0].Caption;
for (int k = 1; k <= columns.Set.Tuples.Count;k++ )
{ //按順序把度量值資料格集合的值填充到表中
row[k] = valuesCell[valuesIndex].Value;
valuesIndex++;
}
table.Rows.Add(row);
}
return table;
}
private void button1_Click(object sender, EventArgs e)
{
Adomd();
}
}
}