Compartilhar via


Recuperando dados usando CellSet

Ao recuperar dados analíticos, o objeto CellSet oferece o máximo de interatividade e de flexibilidade. O objeto CellSet é um cache em memória de dados hierárquicos e de metadados que armazena a dimensionalidade original dos dados. O objeto CellSet também pode ser atravessado em um estado conectado ou desconectado. Por causa desse recurso de desconexão, o objeto CellSet pode ser usado para exibir dados e metadados em qualquer ordem e oferece o modelo de dados mais abrangente para a recuperação de dados. O recurso de desconexão também faça com que o objeto CellSet obtenha o máximo de sobrecarga e seja o modelo de objeto de recuperação de dados do ADOMD.NET de preenchimento mais lento.

Recuperando dados em um estado conectado

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

  1. Crie uma nova instância do objeto.

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

  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 tiver executado a consulta e retornado 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 propriedades Axes e FilterAxis do objeto CellSet representam os metadados de eixos de consulta e slicer, respectivamente, no conjunto de células retornado. Ambas as propriedades retornam referências a objetos de Axis que, por sua vez, contêm as posições representadas em cada eixo.

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

  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 tiver executado a consulta e retornado um CellSet, você poderá recuperar os dados usando a coleção Cells 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 CellSet: as legendas (metadados) das colunas são recuperadas do primeiro eixo e as legendas (metadados) de cada linha são recuperadas do segundo eixo, e os dados de interseção são recuperados por meio da coleção de 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
}

Recuperando dados em um estado desconectado

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

ObservaçãoObservação

Nem todas as propriedades dos objetos estão disponíveis a partir do objeto CellSet durante 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 do exemplo a seguir é executado com uma chamada a ExecuteXmlReader e o resultado é retornado como um System.Xml.XmlReader. O exemplo preenche o objeto CellSet usando esse System.Xml.XmlReader com o método LoadXml. Embora este exemplo carregue 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 qualquer meio antes de carregar os dados em um conjunto de 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
}