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:
Creare una nuova istanza dell'oggetto.
Per creare una nuova istanza dell'oggetto CellSet, chiamare il metodo Execute o ExecuteCellSet dell'oggetto AdomdCommand.
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.
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.
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
}