zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C#中使用ADOMD.NET查询多维数据集的实现方法

c#Net方法数据 实现 使用 查询 多维
2023-06-13 09:15:29 时间

本文实例讲述了C#中使用ADOMD.NET查询多维数据集的实现方法,分享给大家供大家参考。具体实现方法分析如下:

ADOMD.NET是用于与MicrosoftSQLServerAnalysisServices进行通信的Microsoft.NETFramework数据访问接口。ADOMD.NET可使用XMLforAnalysis协议与分析数据源通信,方法为使用TCP/IP或HTTP连接传输和接收符合XMLforAnalysis规范的SOAP请求和响应。命令可通过多维表达式(MDX)、数据挖掘扩展插件(DMX)、AnalysisServices脚本语言(ASSL)或者甚至是有限SQL语法来发送,并且可能不返回结果。可以使用ADOMD.NET对象模型来查询和操作分析数据、关键绩效指标(KPI)和挖掘模型。使用ADOMD.NET时,还可通过检索与OLEDB兼容的架构行集或者使用ADOMD.NET对象模型来查看和使用元数据。

ADOMD.NET数据访问接口由Microsoft.AnalysisServices.AdomdClient命名空间表示

实战,连接并查询多维数据集:

复制代码代码如下:

stringconnectionString="DataSource=localhost;Catalog=MDXStep-by-Step;ConnectTo=11.0;IntegratedSecurity=SSPI";
AdomdConnection_connection=newAdomdConnection(connectionString);
if(_connection!=null)
if(_connection.State==ConnectionState.Closed)
   _connection.Open();
AdomdCommandcommand=_connection.CreateCommand();
StringBuildersb=newStringBuilder();
sb.Append("WITH");
sb.Append(" MEMBER[Product].[Category].[AllProducts].[X]AS1+1");
sb.Append("SELECT{([Date].[Calendar].[CY2002]),([Date].[Calendar].[CY2003])}*{([Measures].[ResellerSalesAmount])}ONCOLUMNS,");
sb.Append("{([Product].[Category].[Accessories]),([Product].[Category].[Bikes]),([Product].[Category].[Clothing]),");
sb.Append("([Product].[Category].[Components]),([Product].[Category].[X])}ONROWS");
sb.Append(" FROM[Step-by-Step]");
command.CommandText=sb.ToString();

varxmlreader=command.ExecuteXmlReader();
CellSetcellSet=CellSet.LoadXml(xmlreader);

_connection.Close();
vardt=ToDataTable(cellSet);
varv=dt.Rows.Count;

AdomdHelper.cs文件如下:

复制代码代码如下:

usingSystem;
usingSystem.Data;
usingMicrosoft.AnalysisServices.AdomdClient;
namespaceWpfApplication1
{
   ///<summary>
   ///SummarydescriptionforAdomdHelper.
   ///</summary>
   publicclassAdomdHelper
   {
       #region"==Enum============================================================"
       publicenumVersions
       {
           Server,
           Provider,
           Client
       }
       #endregion

       #region"==Methods============================================================"
       //判断连接AdomdConnection对象是State是否处于Open状态。
       publicboolIsConnected(refAdomdConnectionconnection)
       {
           return(!(connection==null))&&(connection.State!=ConnectionState.Broken)&&(connection.State!=ConnectionState.Closed);
       }

       ///<summary>
       ///断开连接
       ///</summary>
       ///<paramname="connection">AdomdConnection对象的实例</param>
       ///<paramname="destroyConnection">是否销毁连接</param>
       publicvoidDisconnect(refAdomdConnectionconnection,booldestroyConnection)
       {
           try
           {
               if(!(connection==null))
               {
                   if(connection.State!=ConnectionState.Closed)
                   {
                       connection.Close();
                   }
                   if(destroyConnection==true)
                   {
                       connection.Dispose();
                       connection=null;
                   }
               }
           }
           catch(Exceptionex)
           {
               throwex;
           }
       }
       ///<summary>
       ///建立连接
       ///</summary>
       ///<paramname="connection">AdomdConnection对象的实例</param>
       ///<paramname="connectionString">连接字符串</param>
       publicvoidConnect(refAdomdConnectionconnection,stringconnectionString)
       {
           if(connectionString=="")
               thrownewArgumentNullException("connectionString","Theconnectionstringisnotvalid.");
           //   EnsureanAdomdConnectionobjectexistsandthatitsConnectionStringpropertyisset.
           if(connection==null)
               connection=newAdomdConnection(connectionString);
           else
           {
               Disconnect(refconnection,false);
               connection.ConnectionString=connectionString;
           }
           try
           {
               connection.Open();
           }
           catch(Exceptionex)
           {
               throwex;
           }
       }

       ///<summary>
       ///获取OLAP数据库。
       ///</summary>
       ///<paramname="connection">AdomdConnection对象的实例</param>
       ///<paramname="connectionString">连接字符串</param>
       ///<returns></returns>
       publicDataTableGetSchemaDataSet_Catalogs(refAdomdConnectionconnection,stringconnectionString)
       {

           boolconnected=true;   //判断connection在调用此函数时,是否已经处于连接状态
           DataTableobjTable=newDataTable();
           try
           {
               //Checkifavalidconnectionwasprovided.
               if(IsConnected(refconnection)==false)
               {
                   //如果连接不存在,则建立连接
                   Connect(refconnection,connectionString);
                   connected=false;      //更改connection为未连接状态。       

               }
               objTable=connection.GetSchemaDataSet(AdomdSchemaGuid.Catalogs,null).Tables[0];
               if(connected==false)
               {
                   //关闭连接
                   Disconnect(refconnection,false);
               }
           }
           catch(Exceptionerr)
           {
               throwerr;
           }
           returnobjTable;
       }

       ///<summary>
       ///通过SchemaDataSet的方式获取立方体
       ///</summary>
       ///<paramname="connection">AdomdConnection对象的实例</param>
       ///<paramname="connectionString">连接字符串</param>
       ///<returns></returns>
       publicstring[]GetSchemaDataSet_Cubes(refAdomdConnectionconnection,stringconnectionString)
       {
           string[]strCubes=null;
           boolconnected=true;  //判断connection是否已与数据库连接
           DataTableobjTable=newDataTable();
           if(IsConnected(refconnection)==false)
           {
               try
               {
                   Connect(refconnection,connectionString);
                   connected=false;
               }
               catch(Exceptionerr)
               {
                   throwerr;
               }
           }
           string[]strRestriction=newstring[]{null,null,null};
           objTable=connection.GetSchemaDataSet(AdomdSchemaGuid.Cubes,strRestriction).Tables[0];
           if(connected==false)
           {
               Disconnect(refconnection,false);
           }
           strCubes=newstring[objTable.Rows.Count];
           introwcount=0;
           foreach(DataRowtempRowinobjTable.Rows)
           {
               strCubes[rowcount]=tempRow["CUBE_NAME"].ToString();
               rowcount++;
           }
           returnstrCubes;
       }

       ///<summary>
       ///通过SchemaDataSet的方式获取制定立方体的维度
       ///</summary>
       ///<paramname="connection">AdomdConnection对象的实例</param>
       ///<paramname="connectionString">连接字符串</param>
       ///<returns></returns>
       publicstring[]GetSchemaDataSet_Dimensions(refAdomdConnectionconnection,stringconnectionString,stringcubeName)
       {
           string[]strDimensions=null;
           boolconnected=true;  //判断connection是否已与数据库连接
           DataTableobjTable=newDataTable();
           if(IsConnected(refconnection)==false)
           {
               try
               {
                   Connect(refconnection,connectionString);
                   connected=false;
               }
               catch(Exceptionerr)
               {
                   throwerr;
               }
           }
           string[]strRestriction=newstring[]{null,null,cubeName,null,null};
           objTable=connection.GetSchemaDataSet(AdomdSchemaGuid.Dimensions,strRestriction).Tables[0];
           if(connected==false)
           {
               Disconnect(refconnection,false);
           }
           strDimensions=newstring[objTable.Rows.Count];
           introwcount=0;
           foreach(DataRowtempRowinobjTable.Rows)
           {
               strDimensions[rowcount]=tempRow["DIMENSION_NAME"].ToString();
               rowcount++;
           }
           returnstrDimensions;
       }

       ///<summary>
       ///以connection的方式获取立方体
       ///</summary>
       ///<paramname="connection">AdomdConnection对象的实例</param>
       ///<paramname="connectionString">连接字符串</param>
       ///<returns></returns>
       publicstring[]GetCubes(refAdomdConnectionconnection,stringconnectionString)
       {
           string[]strCubesName=null;
           boolconnected=true;  //判断connection是否已与数据库连接
           if(IsConnected(refconnection)==false)
           {
               try
               {
                   Connect(refconnection,connection.ConnectionString);
                   connected=false;
               }
               catch(Exceptionerr)
               {
                   throwerr;
               }
           }

           introwcount=connection.Cubes.Count;
           strCubesName=newstring[rowcount];
           for(inti=0;i<rowcount;i++)
           {
               strCubesName[i]=connection.Cubes[i].Caption;
           }

           if(connected==false)
           {
               Disconnect(refconnection,false);
           }
           returnstrCubesName;
       }

       ///<summary>
       ///获取立方体的维度
       ///</summary>
       ///<paramname="connection">AdomdConnection对象的实例</param>
       ///<paramname="connectionString">连接字符串</param>
       ///<paramname="CubeName">立方体名称</param>
       ///<returns></returns>
       publicstring[]GetDimensions(refAdomdConnectionconnection,stringconnectionString,stringCubeName)
       {
           string[]strDimensions=null;
           boolconnected=true;
           if(IsConnected(refconnection)==false)
           {
               try
               {
                   Connect(refconnection,connection.ConnectionString);
                   connected=false;
               }
               catch(Exceptionerr)
               {
                   throwerr;
               }
           }

           introwcount=connection.Cubes[CubeName].Dimensions.Count;
           strDimensions=newstring[rowcount];
           for(inti=0;i<rowcount;i++)
           {
               strDimensions[i]=connection.Cubes[CubeName].Dimensions[i].Caption.ToString();
           }
           if(connected==false)
           {
               Disconnect(refconnection,false);
           }
           returnstrDimensions;

       }
       #endregion
   }
}

希望本文所述对大家的C#程序设计有所帮助。