使用 CellSet 检索数据

检索分析数据时,对象 CellSet 可提供最大的交互性和灵活性。 对象 CellSet 是保留数据原始维度的分层数据和元数据的内存中缓存。 还可以 CellSet 在连接或断开连接状态中遍历对象。 由于这种断开连接的能力, CellSet 对象可用于按任意顺序查看数据和元数据,并提供最全面的数据检索对象模型。 这种断开连接的功能还会导致 CellSet 对象开销最大,并且成为要填充 ADOMD.NET 检索对象模型的最慢。

在连接状态下检索数据

若要使用 CellSet 对象检索数据,请执行以下步骤:

  1. 创建对象的新实例。

    若要创建 对象的新实例 CellSet ,请调用 Execute 对象的 或 ExecuteCellSetAdomdCommand 方法。

  2. 标识元数据。

    除了检索数据,ADOMD.NET 还将检索单元集的元数据。 命令运行查询并返回 CellSet后,就可以通过各种 对象检索元数据。 客户端应用程序需要使用此元数据显示单元集数据并与之交互。 例如,许多客户端应用程序提供对单元集中的特定位置进行细分,或分层显示特定位置的子位置的功能。

    在 ADOMD.NET 中 AxesFilterAxisCellSet , 对象的 和 属性分别表示返回的单元集内查询轴和切片器轴的元数据。 这两个属性都 Axis 返回对 对象的引用,而对象又包含每个轴上表示的位置。

    每个 Axis 对象都包含 对象 Position 的集合,这些对象表示可用于该轴的元组集。 每个 Position 对象表示一个元组,其中包含一个或多个成员,由 对象 Member 的集合表示。

  3. 从单元集集合检索数据。

    除了检索元数据,ADOMD.NET 还将检索单元集的数据。 命令运行查询并返回 CellSet后,就可以使用 的集合检索 Cells 数据 CellSet。 此集合包含为查询中的所有轴的交点计算出的值。 因此,有多个可用于访问每个交点或单元的索引器。 有关索引器的列表,请参阅 Item[]

在连接状态下检索数据的示例

下面的示例连接到本地服务器,然后对该连接运行命令。 该示例使用 CellSet 对象模型分析结果:从第一个轴检索列的标题 (元数据) ,从第二个轴检索每行的标题 (元数据) Cells ,使用 集合检索相交数据。

string ReturnCommandUsingCellSet()
{
    //Create a new string builder to store the results
    System.Text.StringBuilder result = new System.Text.StringBuilder();

    //Connect to the local server
    using (AdomdConnection conn = new AdomdConnection("Data Source=localhost;"))
    {
        conn.Open();

        //Create a command, using this connection
        AdomdCommand cmd = conn.CreateCommand();
        cmd.CommandText = @"
                      WITH MEMBER [Measures].[FreightCostPerOrder] AS 
                            [Measures].[Reseller Freight Cost]/[Measures].[Reseller Order Quantity],  
                            FORMAT_STRING = 'Currency'
                      SELECT 
                            [Geography].[Geography].[Country].&[United States].Children ON ROWS, 
                            [Date].[Calendar].[Calendar Year] ON COLUMNS
                      FROM [Adventure Works]
                      WHERE [Measures].[FreightCostPerOrder]";

        //Execute the query, returning a cellset
        CellSet cs = cmd.ExecuteCellSet();

        //Output the column captions from the first axis
        //Note that this procedure assumes a single member exists per column.
        result.Append("\t");
        TupleCollection tuplesOnColumns = cs.Axes[0].Set.Tuples;
        foreach (Tuple column in tuplesOnColumns)
        {
            result.Append(column.Members[0].Caption + "\t");
        }
        result.AppendLine();

        //Output the row captions from the second axis and cell data
        //Note that this procedure assumes a two-dimensional cellset
        TupleCollection tuplesOnRows = cs.Axes[1].Set.Tuples;
        for (int row = 0; row < tuplesOnRows.Count; row++)
        {
            result.Append(tuplesOnRows[row].Members[0].Caption + "\t");
            for (int col = 0; col < tuplesOnColumns.Count; col++)
            {
                result.Append(cs.Cells[col, row].FormattedValue + "\t");
            }
            result.AppendLine();
        }
        conn.Close();

        return result.ToString();
    } // using connection
}

在断开连接状态下检索数据

通过加载从上一个 CellSet 查询返回的 XML,可以使用 对象提供浏览分析数据的综合方法,而无需活动连接。

注意

在断开连接状态时,并非对象中可用的 CellSet 对象的所有属性都可用。 有关详细信息,请参阅 LoadXml

在断开连接状态下检索数据的示例

下面的示例与本主题中前面介绍的元数据和数据示例类似。 但是,以下示例中的 命令通过 ExecuteXmlReader调用 运行,结果作为一个System.Xml 。XmlReader。 然后,该示例使用此 CellSet 代码填充 System.Xml。具有 方法的LoadXml XmlReader。 尽管此示例加载了 System.Xml。XmlReader 可以立即将读取器包含的 XML 缓存到硬盘,或者通过任何方式将数据传输至其他应用程序,然后再将数据加载到单元集。

string DemonstrateDisconnectedCellset()
{
    //Create a new string builder to store the results
    System.Text.StringBuilder result = new System.Text.StringBuilder();

    //Connect to the local server
    using (AdomdConnection conn = new AdomdConnection("Data Source=localhost;"))
    {
        conn.Open();

        //Create a command, using this connection
        AdomdCommand cmd = conn.CreateCommand();
        cmd.CommandText = @"
                      WITH MEMBER [Measures].[FreightCostPerOrder] AS 
                            [Measures].[Reseller Freight Cost]/[Measures].[Reseller Order Quantity],  
                            FORMAT_STRING = 'Currency'
                      SELECT 
                            [Geography].[Geography].[Country].&[United States].Children ON ROWS, 
                            [Date].[Calendar].[Calendar Year] ON COLUMNS
                      FROM [Adventure Works]
                      WHERE [Measures].[FreightCostPerOrder]";


        //Execute the query, returning an XmlReader
        System.Xml.XmlReader x = cmd.ExecuteXmlReader();

        //At this point, the XmlReader could be stored on disk,
        //transmitted, modified, cached, or otherwise manipulated

        //Load the CellSet with the specified XML
        CellSet cs = CellSet.LoadXml(x);

        //Now that the XmlReader has finished being read
        //we can close it and the connection, while the
        //CellSet can continue being used.
        x.Close();
        conn.Close();

        //Output the column captions from the first axis
        //Note that this procedure assumes a single member exists per column.
        result.Append("\t");
        TupleCollection tuplesOnColumns = cs.Axes[0].Set.Tuples;
        foreach (Tuple column in tuplesOnColumns)
        {
            result.Append(column.Members[0].Caption + "\t");
        }
        result.AppendLine();

        //Output the row captions from the second axis and cell data
        //Note that this procedure assumes a two-dimensional cellset
        TupleCollection tuplesOnRows = cs.Axes[1].Set.Tuples;
        for (int row = 0; row < tuplesOnRows.Count; row++)
        {
            result.Append(tuplesOnRows[row].Members[0].Caption + "\t");
            for (int col = 0; col < tuplesOnColumns.Count; col++)
            {
                result.Append(cs.Cells[col, row].FormattedValue + "\t");
            }
            result.AppendLine();
        }

        return result.ToString();
    } // using connection
}