Recupero di dati tramite l'oggetto CellSet

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

Recupero di dati in uno stato connesso

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

  1. Creare una nuova istanza dell'oggetto.

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

  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 proprietà e dell'oggetto rappresentano rispettivamente i metadati degli assi della query e del filtro dei dati Axes nel set di celle FilterAxis CellSet restituito. Entrambe le proprietà restituiscono riferimenti a oggetti che Axis a loro volta contengono le posizioni rappresentate su ogni asse.

    Ogni Axis oggetto contiene una raccolta di oggetti che rappresentano il set di Position tuple disponibili per tale asse. Ogni Position oggetto 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 , è possibile recuperare i dati CellSet usando la raccolta di Cells 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) per ogni riga vengono recuperate dal secondo asse e i dati di intersezione vengono recuperati tramite la Cells 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, è possibile utilizzare l'oggetto per fornire un metodo completo per l'esplorazione dei dati analitici senza CellSet 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 ExecuteXmlReader e il risultato viene restituito come System.Xml. XmlReader. L'esempio popola quindi CellSet l'oggetto usando questa System.Xml. XmlReader con il LoadXml metodo . Anche se in questo esempio viene caricato ilSystem.Xml. XmlReader immediatamente, è possibile memorizzare nella cache il codice XML contenuto dal lettore in un disco rigido o trasportare i dati in un'applicazione diversa in qualsiasi modo 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
}