Recuperación de datos utilizando CellSet

Al recuperar datos analíticos, el CellSet objeto proporciona la mayor interactividad y flexibilidad. El CellSet objeto es una caché en memoria de datos jerárquicos y metadatos que conserva la dimensionalidad original de los datos. El CellSet objeto también se puede recorrer en un estado conectado o desconectado. Debido a esta capacidad desconectada, el CellSet objeto se puede usar para ver los datos y metadatos en cualquier orden y proporciona el modelo de objetos más completo para la recuperación de datos. Esta capacidad desconectada también hace que el objeto CellSet tenga la mayor sobrecarga y sea el modelo de objetos de recuperación de datos ADOMD.NET más lento en poblarse.

Recuperación de datos en un estado conectado

Para usar el CellSet objeto para recuperar datos, siga estos pasos:

  1. Cree una nueva instancia del objeto .

    Para crear una nueva instancia del objeto CellSet, llame al método Execute o al método ExecuteCellSet del objeto AdomdCommand.

  2. Identificar metadatos.

    Además de recuperar datos, ADOMD.NET también recupera metadatos para el conjunto de celdas. Tan pronto como el comando haya ejecutado la consulta y devuelto un CellSet, puede recuperar los metadatos a través de varios objetos. Estos metadatos son necesarios para que las aplicaciones cliente muestren e interactúen con los datos del conjunto de celdas. Por ejemplo, muchas aplicaciones cliente proporcionan funcionalidad para examinar en detalle o mostrar jerárquicamente las posiciones secundarias de una posición especificada en un cellset.

    En ADOMD.NET, las propiedades Axes y FilterAxis del objeto CellSet representan los metadatos de los ejes de consulta y de segmentación, respectivamente, en el conjunto de celdas devuelto. Ambas propiedades devuelven referencias a Axis objetos, que a su vez contienen las posiciones representadas en cada eje.

    Cada Axis objeto contiene una colección de Position objetos que representan el conjunto de tuplas disponibles para ese eje. Cada Position objeto representa una sola tupla que contiene uno o varios miembros, representados por una colección de Member objetos .

  3. Recuperar datos de la colección de conjuntos de celdas.

    Además de recuperar metadatos, ADOMD.NET también recupera datos del conjunto de celdas. Tan pronto como el comando haya ejecutado la consulta y devuelto un CellSet, puede recuperar los datos mediante la colección Cells de CellSet. Esta colección contiene los valores que se calculan para la intersección de todos los ejes de la consulta. Por lo tanto, hay varios indexadores para acceder a cada intersección o celda. Para obtener una lista de indizadores, vea Item[].

Ejemplo de recuperación de datos en un estado conectado

En el ejemplo siguiente se establece una conexión con el servidor local y, a continuación, se ejecuta un comando en la conexión. En el ejemplo se analizan los resultados mediante el modelo de objetos CellSet : los títulos (metadatos) de las columnas se recuperan del primer eje y los títulos (metadatos) de cada fila se recuperan del segundo eje y los datos de intersección se recuperan mediante la Cells colección.

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
}

Recuperación de datos en un estado desconectado

Al cargar XML devuelto desde una consulta anterior, puede usar el CellSet objeto para proporcionar un método completo de exploración de datos analíticos sin necesidad de una conexión activa.

Nota:

No todas las propiedades de los objetos que están disponibles en el CellSet objeto están disponibles mientras están en estado desconectado. Para obtener más información, consulte LoadXml.

Ejemplo de recuperación de datos en un estado desconectado

El ejemplo siguiente es similar al ejemplo de metadatos y datos mostrados anteriormente en este tema. Sin embargo, el comando del ejemplo siguiente se ejecuta con una llamada a ExecuteXmlReadery el resultado se devuelve como System.Xml.XmlReader. A continuación, el ejemplo rellena el CellSet objeto mediante este System.Xml.XmlReader con el LoadXml método . Aunque en este ejemplo se carga System.Xml.XmlReader inmediatamente, puede almacenar en caché el XML contenido por el lector en un disco duro o transportar esos datos a una aplicación diferente a través de cualquier medio antes de cargar los datos en un conjunto de celdas.

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
}