您的位置:首页 > 其它

Web连接cube,并将CellSet转成DataTable

2016-02-05 10:54 369 查看
Web连接cube,并将CellSet转成DataTable

1. 正常情况下我们使用ssrs连接cube,但是由于ssrs的局限性以及其它需求的存在,我们希望直接通过web应用程序来连接cube,就像直接连接sqlserver、oracle等数据库一样。

2. 如果要通过web程序连接ms的cube的话,我们需要通过一个额外的组件即ADOMD.NET来进行连接,该组件可在C:\Program Files(x86)\Microsoft.NET\ADOMD.NET\10中找到,文件名为Microsoft.AnalysisServices.AdomdClient.dll,引用后可通过using Microsoft.AnalysisServices.AdomdClient命名控件来调用其下的对象和功能。

3. Microsoft.AnalysisServices.AdomdClient下主要包含以下对象

l AdomdConnection

l AdomdCommand

l AdomdDataAdapter

l AdomdDataReader

l CellSet等

4. 以上对象的使用参考System.Data.SqlClient名称空间下的SqlConnection等,一般只使用AdomdCommand的ExecuteCellSet()方法,获取CellSet,然后再转成DataTable

5. 转成DataTable的方法如下

/// <summary>
/// CellSet转成DataTable(只能转换一维二维数据)
/// </summary>
/// <param name="cs"></param>
/// <returns></returns>
public DataTable ToDataTable(CellSet cs)
{
DataTable dt = new DataTable("ResultTable");
DataColumn dc = null;
DataRow dr = null;

//列名或行名
string name;
//添加行数据
int pos = 0;

if (cs.Axes.Count > 0)
{
//当为二维数据时,第一列:必有为维度描述(行头)
if (cs.Axes.Count == 2) dt.Columns.Add(new DataColumn("Description"));

//生成数据列对象
foreach (Position px in cs.Axes[0].Positions)
{
dc = new DataColumn();
name = "";

foreach (Member m in px.Members) name = name + m.Caption + " ";
dc.ColumnName = name;

dt.Columns.Add(dc);
}
}

if (cs.Axes.Count == 1)
{
//一维数据转换为DataTable
int rowCount = cs.Cells.Count / dt.Columns.Count;
for (int rowIndex = 0; rowIndex < rowCount; rowIndex++)
{
dr = dt.NewRow();

for (int columnIndex = 0; columnIndex < dt.Columns.Count; columnIndex++)
{
dr[columnIndex] = cs[pos++].FormattedValue;
}

dt.Rows.Add(dr);
}
}
else if (cs.Axes.Count == 2)
{
//二维数据转换为DataTable
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: