Recupero di dati tramite l'oggetto CellSet

Quando si recuperano dati analitici, l'oggetto CellSet offre la massima interattività e flessibilità. L'oggetto CellSet è una cache in memoria di dati gerarchici e metadati che mantiene la dimensionalità originale dei dati. L'oggetto CellSet può anche essere attraversato in uno stato connesso o disconnesso. Grazie a questa capacità disconnessa, l'oggetto CellSet può essere usato per visualizzare dati e metadati in qualsiasi ordine e fornisce il modello a oggetti più completo per il recupero dei dati. Questa funzionalità disconnessa determina anche CellSet l'overhead maggiore per l'oggetto e il più lento ADOMD.NET modello a oggetti di recupero dati da popolare.

Recupero di dati in uno stato connesso

Per usare l'oggetto CellSet per recuperare i dati, seguire questa procedura:

  1. Creare una nuova istanza dell'oggetto.

    Per creare una nuova istanza dell'oggetto CellSet , chiamare il Execute metodo o ExecuteCellSet dell'oggetto AdomdCommand .

  2. Identificare i metadati.

    Oltre a recuperare dati, ADOMD.NET recupera anche i metadati per il set di celle. Non appena il comando ha eseguito la query e ha restituito CellSet, è possibile recuperare i metadati tramite vari oggetti. Tali metadati sono necessari affinché le applicazioni client visualizzino e interagiscano con i dati del set di celle. Molte applicazioni client ad esempio consentono di eseguire il drill-down o di visualizzare gerarchicamente le posizioni figlio di una posizione specificata in un set di celle.

    In ADOMD.NET, le AxesFilterAxisCellSet proprietà e dell'oggetto rappresentano rispettivamente i metadati degli assi della query e del filtro dei dati nel set di celle restituito. Entrambe le proprietà restituiscono riferimenti Axis agli oggetti , che a loro volta contengono le posizioni rappresentate su ogni asse.

    Ogni Axis oggetto contiene una raccolta di Position oggetti che rappresentano il set di tuple disponibili per tale asse. Ogni Position oggetto rappresenta una singola tupla che contiene uno o più membri, rappresentati da una raccolta di Member oggetti .

  3. Recuperare i dati dalla raccolta del set di celle.

    Oltre a recuperare metadati, ADOMD.NET recupera anche i dati per il set di celle. Non appena il comando ha eseguito la query e ha restituito CellSet, è possibile recuperare i dati usando la Cells raccolta di CellSet. Poiché tale raccolta contiene i valori calcolati per l'intersezione di tutti gli assi nella query, sono presenti diversi indicizzatori per accedere a ogni intersezione o cella. Per un elenco di indicizzatori, vedere Item[].

Esempio di recupero di dati in uno stato connesso

Nell'esempio seguente viene stabilita una connessione al server locale, quindi viene eseguito un comando nella connessione. L'esempio analizza i risultati usando il modello a oggetti CellSet : le didascalie (metadati) per le colonne vengono recuperate dal primo asse e le didascalie (metadati) Cells per ogni riga vengono recuperate dal secondo asse e i dati intersecanti vengono recuperati tramite la raccolta .

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
}

Recupero di dati in uno stato disconnesso

Caricando il codice XML restituito da una query precedente, CellSet è possibile usare l'oggetto per fornire un metodo completo di esplorazione dei dati analitici senza richiedere una connessione attiva.

Nota

Non tutte le proprietà degli oggetti disponibili dall'oggetto CellSet sono disponibili in uno stato disconnesso. Per altre informazioni, vedere LoadXml.

Esempio di recupero di dati in uno stato disconnesso

L'esempio seguente è analogo a quello relativo ai metadati e ai dati illustrato in precedenza in questo argomento. Tuttavia, il comando nell'esempio seguente viene eseguito con una chiamata a ExecuteXmlReadere il risultato viene restituito come System.Xml. XmlReader. L'esempio popola quindi l'oggetto CellSet usando questo System.Xml. XmlReader con il LoadXml metodo . Anche se in questo esempio viene caricato System.Xml. XmlReader immediatamente , è possibile memorizzare nella cache il codice XML contenuto dal lettore su un disco rigido o trasportarlo in un'applicazione diversa tramite qualsiasi mezzo prima di caricare i dati in un set di celle.

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
}