Share via


Recuperando dados usando CellSet

Ao recuperar dados analíticos, o CellSet objeto fornece a maior parte da interatividade e flexibilidade. O CellSet objeto é um cache na memória de dados hierárquicos e metadados que retém a dimensionalidade original dos dados. O CellSet objeto também pode ser percorrido em um estado conectado ou desconectado. Devido a essa capacidade desconectada, o CellSet objeto pode ser usado para exibir dados e metadados em qualquer ordem e fornece o modelo de objeto mais abrangente para a recuperação de dados. Esse recurso desconectado também faz com que o CellSet objeto tenha a maior sobrecarga e seja o modelo de objeto de recuperação de dados ADOMD.net mais lento para popular.

Recuperando dados em um estado conectado

Para usar o CellSet objeto para recuperar dados, siga estas etapas:

  1. Crie uma nova instância do objeto.

    Para criar uma nova instância do CellSet objeto, chame o Execute método ou ExecuteCellSet do AdomdCommand objeto.

  2. Identifique metadados.

    Além de recuperar dados, o ADOMD.NET também recupera metadados para o conjunto de células. Assim que o comando executar a consulta e retornar um CellSet , você poderá recuperar os metadados por meio de vários objetos. Esses metadados são necessários para que aplicativos cliente exibam e interajam com os dados do conjunto de células. Por exemplo, muitos aplicativos cliente oferecem funcionalidade para busca detalhada de, ou a exibição hierárquica das posições filho de, uma posição especificada em um conjunto de células.

    No ADOMD.NET, as Axes Propriedades e FilterAxis do CellSet objeto representam os metadados dos eixos de consulta e segmentação de tópicos, respectivamente, no células retornado. Ambas as propriedades retornam referências a Axis objetos, que, por sua vez, contêm as posições representadas em cada eixo.

    Cada Axis objeto contém uma coleção de Position objetos que representam o conjunto de tuplas disponíveis para esse eixo. Cada Position objeto representa uma única tupla que contém um ou mais membros, representados por uma coleção de Member objetos.

  3. Recupere dados da coleção de conjuntos de células.

    Além de recuperar metadados, o ADOMD.NET também recupera dados para o conjunto de células. Assim que o comando executar a consulta e retornar um CellSet , você poderá recuperar os dados usando a Cells coleção de CellSet . Essa coleção contém os valores calculados para a interseção de todos os eixos na consulta. Dessa forma, existem vários indexadores para o acesso a cada interseção ou célula. Para obter uma lista de indexadores, consulte Item[] .

Exemplo de recuperação de dados em um estado conectado

O exemplo a seguir cria uma conexão ao servidor local e executa um comando nessa conexão. O exemplo analisa os resultados usando o modelo de objeto células : as legendas (metadados) para as colunas são recuperadas do primeiro eixo e as legendas (metadados) para cada linha são recuperadas do segundo eixo e os dados de interseção são recuperados usando a Cells coleção.

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
}

Recuperando dados em um estado desconectado

Ao carregar o XML retornado de uma consulta anterior, você pode usar o CellSet objeto para fornecer um método abrangente de navegação de dados analíticos sem a necessidade de uma conexão ativa.

Observação

Nem todas as propriedades dos objetos que estão disponíveis no CellSet objeto estão disponíveis enquanto estiverem em um estado desconectado. Para obter mais informações, consulte LoadXml.

Exemplo de recuperação de dados em um estado desconectado

O exemplo a seguir é semelhante ao exemplo de metadados e de dados mostrado anteriormente neste tópico. No entanto, o comando no exemplo a seguir é executado com uma chamada para ExecuteXmlReader e o resultado é retornado como um System.Xml. XmlReader. Em seguida, o exemplo popula o CellSet objeto usando esse System.Xml. XmlReader com o LoadXml método. Embora este exemplo carregue o System.Xml. XmlReader imediatamente, você poderia armazenar em cache o XML contido pelo leitor em um disco rígido ou transportar esses dados para um aplicativo diferente por meio de qualquer meio, antes de carregá-los em um células.

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
}