Abrufen von Daten mittels Cellset
Beim Abrufen analytischer Daten bietet das CellSet -Objekt die höchste Interaktivität und Flexibilität. Das CellSet -Objekt ist ein In-Memory-Cache hierarchischer Daten und Metadaten, der die ursprüngliche Dimensionalität der Daten beibehalte. Das CellSet Objekt kann auch in einem verbundenen oder getrennten Zustand durchlaufen werden. Aufgrund dieser getrennten Fähigkeit kann CellSet das -Objekt zum Anzeigen von Daten und Metadaten in beliebiger Reihenfolge verwendet werden und stellt das umfassendste Objektmodell für den Datenabruf bereit. Diese getrennte Funktion führt auch CellSet dazu, dass das Objekt den größten Mehraufwand auf sich hat und das datenabrufende Objektmodell am langsamsten ADOMD.NET aufgefüllt wird.
Abrufen von Daten im Onlinezustand
Führen Sie die folgenden Schritte CellSet aus, um das -Objekt zum Abrufen von Daten zu verwenden:
Erstellen Sie eine neue Instanz des Objekts.
Um eine neue Instanz des -Objekts zu CellSet erstellen, rufen Sie die - oder Execute - ExecuteCellSet Methode des -Objekts AdomdCommand auf.
Identifizieren Sie die Metadaten.
Neben dem Abruf von Daten ruft ADOMD.NET auch Metadaten für das Cellset ab. Sobald der Befehl die Abfrage ausgeführt CellSetund einen zurückgegeben hat, können Sie die Metadaten über verschiedene Objekte abrufen. Diese Metadaten werden benötigt, damit Clientanwendungen Cellsetdaten anzeigen und mit diesen interagieren können. Beispielsweise bieten viele Clientanwendungen Funktionen für ein Drilldown oder eine hierarchische Anzeige der untergeordneten Positionen einer angegebenen Position im Cellset.
In ADOMD.NET stellen die Axes Eigenschaften und FilterAxisCellSet des -Objekts die Metadaten der Abfrage- bzw. Slicerachsen im zurückgegebenen Cellset dar. Beide Eigenschaften geben Verweise auf Objekte Axis zurück, die wiederum die positionen enthalten, die auf jeder Achse dargestellt werden.
Jedes Axis -Objekt enthält eine Auflistung von - Position Objekten, die den Satz von Tupeln darstellen, die für diese Achse verfügbar sind. Jedes Position -Objekt stellt ein einzelnes Tupel dar, das ein oder mehrere Member enthält, die durch eine Auflistung von -Objekten dargestellt Member werden.
Rufen Sie die Daten aus der Cellsetauflistung ab.
Neben dem Abruf von Metadaten ruft ADOMD.NET auch Daten für das Cellset ab. Sobald der Befehl die Abfrage ausgeführt CellSetund einen zurückgegeben hat, Cells können Sie die Daten mithilfe der Auflistung von abrufen CellSet. Diese Auflistung enthält die Werte, die für die Schnittmenge aller Achsen in der Abfrage berechnet werden. Deshalb gibt es mehrere Indexer für den Zugriff auf jede Schnittmenge oder Zelle. Eine Liste der Indexer finden Sie unter Item[].
Beispiel für das Abrufen von Daten im Onlinezustand
Das folgende Beispiel stellt eine Verbindung zum lokalen Server her und führt dann einen Befehl auf der Verbindung aus. Im Beispiel werden die Ergebnisse mithilfe des CellSet-Objektmodells analysiert: Die Beschriftungen (Metadaten) für die Spalten werden von der ersten Achse abgerufen, und die Beschriftungen (Metadaten) für jede Zeile werden von der zweiten Achse abgerufen, Cells und die sich überschneidenden Daten werden mithilfe der -Auflistung abgerufen.
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
}
Abrufen von Daten im Offlinezustand
Durch Laden von XML, das von einer vorherigen Abfrage zurückgegeben wurde, können Sie mit dem -Objekt eine umfassende Methode zum Durchsuchen analytischer Daten bereitstellen, CellSet ohne dass eine aktive Verbindung erforderlich ist.
Hinweis
Nicht alle Eigenschaften der Objekte, die über das -Objekt verfügbar CellSet sind, sind verfügbar, während sie sich im getrennten Zustand befinden. Weitere Informationen finden Sie unter LoadXml.
Beispiel für das Abrufen von Daten im Offlinezustand
Das folgende Beispiel ähnelt dem zuvor in diesem Thema behandelten Metadaten- und Datenbeispiel. Der Befehl im folgenden Beispiel wird jedoch mit einem ExecuteXmlReaderAufruf von ausgeführt, und das Ergebnis wird alsSystem.Xml . XmlReader. Das Beispiel füllt dann das -Objekt mithilfe CellSet diesesSystem.Xml . XmlReader mit der - LoadXml Methode. In diesem Beispiel wird dieSystem.Xml . XmlReader können Sie den im Reader enthaltenen XML-Code sofort auf einer Festplatte zwischenspeichern oder diese Daten auf beliebige Weise in eine andere Anwendung übertragen, bevor Sie die Daten in ein Cellset laden.
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
}