Recuperar datos mediante el objeto 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, CellSet el objeto se puede usar para ver datos y metadatos en cualquier orden y proporciona el modelo de objetos más completo para la recuperación de datos. Esta funcionalidad desconectada también CellSet hace que el objeto tenga la mayor sobrecarga y sea el modelo de objetos de recuperación ADOMD.NET datos más lento que se rellene.

Recuperar datos en estado conectado

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

  1. Crear una nueva instancia del objeto.

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

  2. Identificar los metadatos.

    Además de recuperar datos, ADOMD.NET también recupera metadatos para el objeto CellSet. Tan pronto como el comando haya ejecutado la consulta y devuelto un , puede recuperar los metadatos a CellSettravés de varios objetos . Estos metadatos son necesarios para que las aplicaciones cliente puedan interactuar con los datos del objeto CellSet y mostrarlos. Por ejemplo, muchas aplicaciones cliente proporcionan funcionalidad para explorar en profundidad una posición especificada en un objeto CellSet o mostrar de forma jerárquica sus posiciones secundarias.

    En ADOMD.NET, las AxesFilterAxisCellSet propiedades y del objeto representan los metadatos de los ejes de consulta y 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 objetos Position que representan el conjunto de tuplas disponibles para ese eje. Cada Position objeto representa una única tupla que contiene uno o varios miembros, representados por una colección de Member objetos .

  3. Recuperar los datos desde la colección de objetos CellSet.

    Además de recuperar metadatos, ADOMD.NET también recupera datos para el objeto CellSet. Tan pronto como el comando haya ejecutado la consulta y devuelto CellSetun , puede recuperar los datos mediante la Cells colección 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 indizadores para obtener acceso a cada intersección o celda. Para obtener una lista de indexadores, vea Item[].

Ejemplo de recuperación de datos en estado conectado

En el ejemplo siguiente se realiza 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, 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
}

Recuperar datos en estado desconectado

Al cargar XML devuelto de una consulta anterior, CellSet puede usar el 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 un estado desconectado. Para obtener más información, vea LoadXml.

Ejemplo de recuperación de datos en estado desconectado

El ejemplo siguiente es similar al ejemplo de metadatos y datos que se muestra anteriormente en este tema. Sin embargo, el comando del ejemplo siguiente se ejecuta con una llamada ExecuteXmlReadera y el resultado se devuelve como unSystem.Xml. XmlReader. A continuación, el ejemplo rellena CellSet el objeto mediante este System.Xml. XmlReader con el LoadXml método . Aunque en este ejemplo se carga elSystem.Xml. XmlReader inmediatamente, podría almacenar en caché el XML contenido por el lector en un disco duro o transportar los 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
}