Recuperar datos mediante el objeto CellSet

Al recuperar datos analíticos, el CellSet objeto proporciona la mayor interactividad y flexibilidad. El objeto es una memoria caché en memoria de datos jerárquicos y metadatos que conserva CellSet la dimensionalidad original de los datos. El CellSet objeto también se puede atravesar en un estado conectado o desconectado. Debido a esta capacidad desconectada, el objeto se puede usar para ver datos y metadatos en cualquier orden y proporciona el modelo de objetos más completo para CellSet la recuperación de datos. Esta funcionalidad desconectada también hace que el objeto tenga la mayor sobrecarga y que sea el modelo de objetos de recuperación ADOMD.NET datos más lento que se CellSet 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 CellSet objeto , llame al método o del objeto Execute ExecuteCellSet AdomdCommand .

  2. Identificar los metadatos.

    Además de recuperar datos, ADOMD.NET también recupera metadatos para el objeto CellSet. En cuanto el comando haya ejecutado la consulta y devuelto CellSet un , puede recuperar los metadatos a travé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 propiedades y del objeto representan los metadatos de los ejes de consulta y segmentación, respectivamente, en el Axes FilterAxis conjunto de CellSet celdas devuelto. Ambas propiedades devuelven referencias a objetos , que a su Axis vez contienen las posiciones representadas en cada eje.

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

  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. En cuanto el comando haya ejecutado la consulta y devuelto un , puede recuperar los datos CellSet mediante la colección de Cells 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 desde una consulta anterior, puede usar el objeto para proporcionar un método completo de exploración de datos analíticos sin CellSet 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 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 a y el resultado se devuelve como un ExecuteXmlReader System.Xml.Xmllector. A continuación, el ejemplo CellSet rellena el objeto mediante esteSystem.Xml.Xml Reader con el LoadXml método . Aunque este ejemplo carga el lector de System.Xml.Xml 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
}