2015-02-05 48 views
0

我是新来的mdx查询,我很好奇使用C#的mdx查询生成,所以我搜索任何演示或开源,然后我发现Ranet.olap(https://ranetuilibraryolap.codeplex.com/)这是提供我所需要的。 服用dll之后,我尝试将它们合并到我的代码中。我正在粘贴我的完整的控制台代码,它应该会生成mdx查询,但它并没有这样做,我做错了什么?如何使用C#生成mdx查询?

using System; 
using System.Collections.Generic; 
using Microsoft.AnalysisServices.AdomdClient; 
using Ranet.Olap.Core.Managers; 
using Ranet.Olap.Core.Metadata; 
using Ranet.Olap.Core.Types; 

namespace MDX 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      startWork(); 
     } 

     public static void startWork() 
     { 
      string connString = "Provider=MSOLAP.3; Data Source=localhost;Initial Catalog=AdventureWorkDW2008R2;Integrated Security=SSPI;"; 
      CubeDef cubes; 
      AdomdConnection conn = new AdomdConnection(connString); 
      conn.Open(); 
      cubes = conn.Cubes.Find("AdventureWorkCube"); 

      Ranet.Olap.Core.Managers.MdxQueryBuilder mdx = new Ranet.Olap.Core.Managers.MdxQueryBuilder(); 
      mdx.Cube = cubes.Caption; 
      List<Ranet.Olap.Core.Wrappers.AreaItemWrapper> listColumn = new List<Ranet.Olap.Core.Wrappers.AreaItemWrapper>(); 
      List<Ranet.Olap.Core.Wrappers.AreaItemWrapper> listRow = new List<Ranet.Olap.Core.Wrappers.AreaItemWrapper>(); 
      List<Ranet.Olap.Core.Wrappers.AreaItemWrapper> listData = new List<Ranet.Olap.Core.Wrappers.AreaItemWrapper>(); 

      //Column area 
      Dimension dmColumn = cubes.Dimensions.Find("Dim Product"); 
      Microsoft.AnalysisServices.AdomdClient.Hierarchy hColumn = dmColumn.Hierarchies["English Product Name"]; 
      //hierarchy properties 
      List<PropertyInfo> lPropInfo = new List<PropertyInfo>(); 
      foreach (var prop in hColumn.Properties) 
      { 
       PropertyInfo p = new PropertyInfo(); 
       p.Name = prop.Name; 
       p.Value = prop.Value; 
       lPropInfo.Add(p); 
      } 
      Ranet.Olap.Core.Wrappers.AreaItemWrapper areaIColumn = new Ranet.Olap.Core.Wrappers.AreaItemWrapper(); 
      areaIColumn.AreaItemType = AreaItemWrapperType.Hierarchy_AreaItemWrapper; 
      areaIColumn.Caption = hColumn.Caption; 
      areaIColumn.CustomProperties = lPropInfo; 
      listColumn.Add(areaIColumn); 

      //Rows Area 
      Dimension dmRow = cubes.Dimensions.Find("Due Date"); 
      Microsoft.AnalysisServices.AdomdClient.Hierarchy hRow = dmRow.Hierarchies["English Month Name"]; 
      List<PropertyInfo> lRowPropInfo = new List<PropertyInfo>(); 
      foreach (var prop in hRow.Properties) 
      { 
       PropertyInfo p = new PropertyInfo(prop.Name,prop.Value); 
       lRowPropInfo.Add(p); 
      } 
      Ranet.Olap.Core.Wrappers.AreaItemWrapper areaIRow = new Ranet.Olap.Core.Wrappers.AreaItemWrapper(); 
      areaIRow.AreaItemType = AreaItemWrapperType.Hierarchy_AreaItemWrapper; 
      areaIRow.Caption = hRow.Caption; 
      areaIRow.CustomProperties = lRowPropInfo; 
      listRow.Add(areaIRow); 


      //Measure Area or Data Area 
      Measure ms = cubes.Measures.Find("Order Quantity"); 
      Ranet.Olap.Core.Wrappers.AreaItemWrapper areaIData = new Ranet.Olap.Core.Wrappers.AreaItemWrapper(); 
      areaIData.AreaItemType = AreaItemWrapperType.Measure_AreaItemWrapper; 
      areaIData.Caption = ms.Caption; 

      List<PropertyInfo> lmpropInfo = new List<PropertyInfo>(); 

      foreach (var prop in ms.Properties) 
      { 
       PropertyInfo p = new PropertyInfo(prop.Name, prop.Value); 
       lmpropInfo.Add(p); 
      } 
      areaIData.CustomProperties = lmpropInfo; 
      listData.Add(areaIData); 

      mdx.AreaWrappersColumns = listColumn; 
      mdx.AreaWrappersRows = listRow; 
      mdx.AreaWrappersData = listData; 
      string mdxQuery = mdx.GenerateMdxQuery(); 
      conn.Close(); 
     } 
    } 
} 
+0

请问您可以添加错误ou tput的?或者mdxquery变量值最初的错误是什么? – George 2015-02-06 06:50:34

+0

它没有给出任何错误。实际上查询生成器方法在生成时不识别列,行和测量项目。的上面的代码输出是 “SELECT FROM [AdventureWorkCube] 电池特性BACK_COLOR,CELL_ORDINAL,FORE_COLOR,FONT_NAME,FONT_SIZE,FONT_FLAGS,FORMAT_STRING,VALUE FORMATTED_VALUE,UPDATEABLE,ACTION_TYPE ” – 2015-02-06 11:29:26

回答

0

仍然在修改代码,这台发动机的过程中,虽然你一些建议:

  • 它看起来像你刚才抢立方体元数据(变暗,措施等),并把它传递给发电机。这听起来不像是生成MDX的方法。 MDX语句应该看起来像

    select 
    { 
        // measures, calculated members 
    } on 0, 
    { 
        // dimension data - sets 
    } on 1 // probably more axis 
    from **Cube** 
    

其他所有参数都是可选的

+0

cubes.Dimensions.Find( “暗淡产品” )返回我的维度对象,它具有像层次结构一样的所有子元素,并且不返回null。而且我也无法找到具有签名FindByName(字符串DimensionName)的方法; – 2015-02-06 11:48:16

+0

是的你是对的,我提到的功能只存在于使用Microsoft.AnalysisServices而不是Adomd – George 2015-02-06 12:17:18

+0

我也在我的项目中使用Microsoft.AnalysisServices.AdomdClient,但它不可用。对于所有提到的DLL你可以检查上面的代码块。 – 2015-02-06 12:20:40

1

生成MDX查询(仅RANET OLAP 3.7版)的一个简单的例子:

using System.Collections.Generic; 
using Ranet.Olap.Core.Data; 
using Ranet.Olap.Core.Managers; 
using Ranet.Olap.Core.Types; 
using Ranet.Olap.Core.Wrappers; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      startWork(); 
     } 

     public static void startWork() 
     { 

      var mdx = new QueryBuilderParameters 
      { 
       CubeName = "[Adventure Works]", 
       SubCube = "", 
       MdxDesignerSetting = new MDXDesignerSettingWrapper(), 
       CalculatedMembers = new List<CalcMemberInfo>(), 
       CalculatedNamedSets = new List<CalculatedNamedSetInfo>(), 
       AreaWrappersFilter = new List<AreaItemWrapper>(), 
       AreaWrappersColumns = new List<AreaItemWrapper>(), 
       AreaWrappersRows = new List<AreaItemWrapper>(), 
       AreaWrappersData = new List<AreaItemWrapper>() 
      }; 

      //define parameters 
      mdx.MdxDesignerSetting.HideEmptyColumns = false; 
      mdx.MdxDesignerSetting.HideEmptyRows = false; 
      mdx.MdxDesignerSetting.UseVisualTotals = false; 
      mdx.MdxDesignerSetting.SubsetCount = 0; 

      var itemCol1 = new Hierarchy_AreaItemWrapper 
      { 
       AreaItemType = AreaItemWrapperType.Hierarchy_AreaItemWrapper, 
       UniqueName = "[Customer].[Customer Geography]" 
      }; 
      mdx.AreaWrappersColumns.Add(itemCol1); 

      var itemRow1 = new Hierarchy_AreaItemWrapper 
      { 
       AreaItemType = AreaItemWrapperType.Hierarchy_AreaItemWrapper, 
       UniqueName = "[Date].[Calendar]" 
      }; 
      mdx.AreaWrappersRows.Add(itemRow1); 

      var itemData1 = new Measure_AreaItemWrapper(); 
      itemData1.AreaItemType = AreaItemWrapperType.Measure_AreaItemWrapper; 
      itemData1.UniqueName = "[Measures].[Internet Order Count]"; 
      mdx.AreaWrappersData.Add(itemData1); 

      string query = MdxQueryBuilder.Default.BuildQuery(mdx, null); 

     } 
    } 
} 

MDX查询结果:

SELECT 
HIERARCHIZE(HIERARCHIZE([Customer].[Customer Geography].Levels(0).Members)) DIMENSION PROPERTIES PARENT_UNIQUE_NAME, HIERARCHY_UNIQUE_NAME, CUSTOM_ROLLUP, UNARY_OPERATOR, KEY0 ON 0, 
HIERARCHIZE(HIERARCHIZE([Date].[Calendar].Levels(0).Members)) DIMENSION PROPERTIES PARENT_UNIQUE_NAME, HIERARCHY_UNIQUE_NAME, CUSTOM_ROLLUP, UNARY_OPERATOR, KEY0 ON 1 
FROM 
[Adventure Works] 
WHERE ([Measures].[Internet Order Count]) 
CELL PROPERTIES BACK_COLOR, CELL_ORDINAL, FORE_COLOR, FONT_NAME, FONT_SIZE, FONT_FLAGS, FORMAT_STRING, VALUE, FORMATTED_VALUE, UPDATEABLE, ACTION_TYPE 
+0

下载此版本[Mdx Query builder示例]的Ranet.Olap和解决方案(https://ranetuilibraryolap.codeplex.com/releases/view/621133) – 2016-10-20 15:34:46