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的方法如下
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; }
相关文章推荐
- Ugly Windows
- Item 19: 使用srd::shared_ptr来管理共享所有权的资源
- 分页技术框架(Pager-taglib)学习一(页面分页)
- 【Xamarin挖墙脚系列:Xamarin开发环境配置需求】
- 转自笔译小王子李锦森 JOHNSON的博客 真正好的英文网站
- ADB故障解决方案
- 数据结构实验之二叉树六:哈夫曼编码
- Item 18: 使用srd::unique_ptr来管理独占所有权的资源
- Item 17: 理解特殊成员函数的生成规则
- InputStream写文件出现大量NUL
- LOB字段存放在指定表空间 清理CLOB字段及压缩CLOB空间
- 2016就业市场 高薪和低潮在哪里?
- 将树莓派Raspberry Pi设置为无线路由器(WiFi热点AP,RTL8188CUS芯片)
- 关于C语言中进制问题以及简单的浅谈进制转化问题。
- 1002. 写出这个数
- Item 16: 让const成员函数做到线程安全
- EasyUi图标
- 从request获取各种路径总结
- 怎么实现iMindMap视图间的快速切换
- Linux脚本参数之if fi