Recupero di dati tramite l'oggetto CellSet

Nel recupero di dati analitici, l'oggetto CellSet fornisce il livello più elevato di interattività e flessibilità. L'oggetto CellSet è costituito da una cache in memoria di dati e metadati gerarchici che mantiene la dimensionalità originale dei dati. L'oggetto CellSet può inoltre trovarsi in uno stato connesso o disconnesso. Grazie alla disponibilità della modalità disconnessa, l'oggetto CellSet può essere utilizzato per visualizzare dati e metadati in qualsiasi ordine e fornisce il modello di oggetti più completo per il recupero dei dati. A causa della possibilità di essere utilizzato anche in modalità disconnessa, l'oggetto CellSet è caratterizzato tuttavia dall'overhead maggiore e rappresenta il modello di oggetti per il recupero dei dati di ADOMD.NET più lento da popolare.

Recupero di dati in uno stato connesso

Per utilizzare l'oggetto CellSet per recuperare dati, effettuare le seguenti operazioni:

  1. Creare una nuova istanza dell'oggetto.

    Per creare una nuova istanza dell'oggetto CellSet, chiamare il metodo Execute 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 un oggetto CellSet, è possibile recuperare i metadati tramite i 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 proprietà Axes e FilterAxis dell'oggetto CellSet rappresentano i metadati degli assi di query e di sezionamento, rispettivamente, nel set di celle restituito. Entrambe le proprietà restituiscono riferimenti a oggetti Axis che a loro volta contengono le posizioni rappresentate su ogni asse.

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

  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 un oggetto CellSet, è possibile recuperare i dati tramite la raccolta Cells dell'oggetto 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. Nell'esempio vengono analizzati i risultati tramite il modello di oggetti CellSet. Le didascalie (metadati) per le colonne vengono recuperate dal primo asse, mentre le didascalie (metadati) per ogni riga vengono recuperate dal secondo asse e i dati di intersezione vengono recuperati tramite la raccolta 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
}

Recupero di dati in uno stato disconnesso

Caricando il codice XML restituito da una query precedente, è possibile utilizzare l'oggetto CellSet per disporre di un metodo completo per l'esplorazione di dati analitici senza che sia necessario stabilire una connessione attiva.

Nota

Non tutte le proprietà disponibili dell'oggetto CellSet lo sono nel caso in cui lo stato sia disconnesso. Per ulteriori 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. Nell'esempio seguente tuttavia il comando viene eseguito con una chiamata a ExecuteXmlReader e il risultato viene restituito come System.Xml.XmlReader. Successivamente nell'esempio l'oggetto viene popolato CellSet con tale System.Xml.XmlReader tramite il metodo LoadXml. Anche se in questo esempio System.Xml.XmlReader viene caricato immediatamente, è possibile memorizzare nella cache il codice XML contenuto dal lettore in un disco rigido o trasmettere tali dati a un'applicazione diversa con qualunque strumento 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
}