作为我的一个项目的一部分,我需要将cellset转换为数据表。如果这个方法的调用者可以指定需要哪些维度作为列,哪些维度是行所需要的,那么这将是非常好的,对于度量也是如此。任何指针? 多维数据集或表格行集:将CellSet转换为DataTable
0
A
回答
0
如果在项目中使用XMLA你可以在2格式之间进行选择。
多维数据集:
这种格式会给你一个单元集(你已经知道了)。
表格行集:
这一个应该更容易转换成数据表。
2
我最近需要在我的项目中执行MDX查询,这严重依赖于ADO数据集和数据表。实际上,要求能够看到MDX查询执行时我在SSMS中看到的内容。
例如,当该MDX在AdventureWorks数据库执行
select
{[Sales Territory].[Sales Territory].[Country].&[France]} on columns,
[Product].[Category].[All Products] on Rows
from
[Adventure Works]
结果集,我们得到的是:
| France
=====================================
All Products | $4,607,537.94
对于这个结果,一个数据表有两列创建包含单个数据行。第二列中的“法国”值是其标题,而不是列名。
我用这个函数将一个网格集转换成一个数据表。未提供函数GetColumnName(num)基于传递的num整数值为列返回一个名称。
Function Cellset2Datatable(ByVal cs As CellSet) As DataTable
Dim dt As New DataTable
Dim dc As DataColumn
Dim dr As DataRow
Dim i, j As Integer
Dim num As Integer = 0
Dim nNumberOfGroupingColumns As Integer = 0
If cs.Axes.Count > 1 Then
For Each m As Member In cs.Axes(1).Positions(0).Members
num += 1
dc = New DataColumn
dc.ColumnName = GetColumnName(num)
dt.Columns.Add(dc)
nNumberOfGroupingColumns += 1
Next
End If
Dim sCaption As String
For Each p As Position In cs.Axes(0).Positions
sCaption = ""
For Each m As Member In p.Members
If sCaption.Equals("") Then
sCaption = String.Format("[{0}]", m.Caption.Trim)
Else
sCaption = String.Format("{0}/[{1}]", sCaption, m.Caption.Trim)
End If
Next
num += 1
dc = New DataColumn
dc.ColumnName = GetColumnName(num)
dc.Caption = sCaption
dt.Columns.Add(dc)
Next
'import data
Dim x As Integer, y As Integer
Dim py As Position
If nNumberOfGroupingColumns > 0 Then
For y = 0 To cs.Axes(1).Positions.Count - 1
py = cs.Axes(1).Positions(y)
i = 0
dr = dt.NewRow
For Each m As Member In py.Members
dr.Item(i) = m.Caption
i += 1
Next
For x = 0 To cs.Axes(0).Positions.Count - 1
dr.Item(i) = cs(x, y).Value
i += 1
Next
dt.Rows.Add(dr)
Next
Else
dr = dt.NewRow
For i = 0 To cs.Axes(0).Positions.Count - 1
dr.Item(i) = cs(i).Value
Next
dt.Rows.Add(dr)
End If
Return dt
End Function
首先,添加列。进行检查,以查看是否在垂直轴存在的任何“分组”列存在并且在这种情况下,相应的列被添加:
If cs.Axes.Count > 1 Then
For Each m As Member In cs.Axes(1).Positions(0).Members
num += 1
dc = New DataColumn
dc.ColumnName = GetColumnName(num)
dt.Columns.Add(dc)
nNumberOfGroupingColumns += 1
Next
End If
下一步是添加对应于水平轴的列
For Each p As Position In cs.Axes(0).Positions
sCaption = ""
For Each m As Member In p.Members
If sCaption.Equals("") Then
sCaption = String.Format("[{0}]", m.Caption.Trim)
Else
sCaption = String.Format("{0}/[{1}]", sCaption, m.Caption.Trim)
End If
Next
num += 1
dc = New DataColumn
dc.ColumnName = GetColumnName(num)
dc.Caption = sCaption
dt.Columns.Add(dc)
Next
此步骤中的列标题用于存储所有级别值。例如, [附件]。[法国]。[互联网订单计数]变为[附件]/[法国]/[互联网订单计数]。 最后一步是将数据导入到数据表中。这两种情况都在这里处理:是否存在“分组”列。
该函数不处理存在两个以上轴的情况。
我在分析服务和MDX方面的经验有限,我刚刚研究了项目需求,所以我对关于概念的“简单”描述表示歉意。
相关问题
- 1. 将DataRow []转换为DataTable的ASP.NET转换
- 2. 将datatable转换为datareader
- 3. 将DataTable转换为对象[,]
- 4. 将SPListItemCollection转换为DataTable
- 5. 将Datatable转换为PDF
- 6. C#将Datatable转换为
- 7. 将Iqueryable转换为DataTable
- 8. 将DataTable转换为CSV流
- 9. 将DataSet \ DataTable转换为CSV
- 10. 将DataTable转换为JSON
- 11. 将IEnumerable转换为DataTable
- 12. 将Xml转换为DataTable
- 13. 将LINQ转换为DataTable
- 14. 将XML转换为DataTable
- 15. DataGrigView转换为DataTable
- 16. 如何将DataTable转换为IDatareader?
- 17. 将DataTable的单列转换为CSV
- 18. 动态地将TreeNode转换为DataTable
- 19. 如何将BindingSource转换为DataTable?
- 20. 将Datatable转换为C#中的数组
- 21. 将DataTable值转换为通用类型
- 22. 如何将Gridview转换为Datatable
- 23. 将DataTable转换为JSON数组
- 24. 在XML中将XML转换为DATATABLE
- 25. 将Json字符串转换为DataTable
- 26. 如何将LINQ结果转换为DATATABLE?
- 27. 将列表转换为DataTable空白{}
- 28. 将DataTable转换为JSON的VB.NET问题
- 29. 将DataTable列从布尔转换为Int
- 30. 将byte []数组转换为DataTable
只是简单地倾销代码而没有解释会鼓励复制和粘贴,并可能导致对OP缺乏真正的理解。建议你在这个帖子附加一些解释代码的每个部分。请记住,OP可能是初学者,因此代码倾销可能会被证明是压倒性的。 – rayryeng
谢谢,我刚刚编辑了我的帖子。 – dbar
Upvoted!感谢您的帮助 – rayryeng