Freigeben über


Abrufen von Daten mittels Cellset

Beim Abruf analytischer Daten bietet das CellSet-Objekt die meiste Interaktivität und Flexibilität. Das CellSet-Objekt ist ein im Arbeitsspeicher befindlicher Cache für hierarchische Daten und Metadaten, der die ursprüngliche Dimensionalität der Daten beibehält. Das CellSet-Objekt kann darüber hinaus in einen Online- oder Offlinezustand traversiert werden. Aufgrund dieser Offline-Fähigkeit kann das CellSet-Objekt verwendet werden, um Daten und Metadaten in beliebiger Reihenfolge einzusehen, und es stellt das umfangreichste Objektmodell für die Datenabfrage bereit. Diese Offline-Fähigkeit führt dazu, dass das CellSet-Objekt den größten Verwaltungsaufwand erfordert und von allen ADOMD.NET-Objektmodellen zur Datenabfrage das langsamste ist.

Abrufen von Daten im Onlinezustand

Um das CellSet-Objekt für das Abrufen von Daten zu verwenden, führen Sie die folgenden Schritte durch:

  1. Erstellen Sie eine neue Instanz des Objekts.

    Um eine neue Instanz des CellSet-Objekts zu generieren, rufen Sie die Methode Execute oder die Methode ExecuteCellSet des AdomdCommand-Objekts auf.

  2. 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 und einen CellSet zurückgegeben hat, können Sie die Metadaten über diverse 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 Eigenschaften Axes und FilterAxis des CellSet-Objekts die Metadaten der Abfrage und der Slicerachsen im zurückgegebenen Cellset dar. Beide Eigenschaften geben Verweise auf Axis-Objekte zurück, die wiederum die Positionen enthalten, die auf jeder Achse dargestellt sind.

    Jedes Axis-Objekt enthält eine Auflistung von Position-Objekten, die die Menge der Tupel darstellen, die für diese Achse verfügbar sind. Jedes Position-Objekt stellt ein einzelnes Tupel dar, das ein oder mehr Elemente enthält, die durch eine Auflistung von Member-Objekten dargestellt werden.

  3. 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 und einen CellSet zurückgegeben hat, können Sie die Daten über die Cells-Auflistung von CellSet abrufen. 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. Das Beispiel analysiert die Ergebnisse mithilfe des CellSet-Objektmodells: 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, und die Schnittmenge wird mithilfe der Cells-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 das Laden von XML, das in einer vorherigen Abfrage zurückgegeben wurde, können Sie das CellSet-Objekt verwenden, um eine umfangreiche Methode für das Durchsuchen analytischer Daten bereitzustellen, ohne dass eine aktive Verbindung erforderlich ist.

HinweisHinweis

Nicht alle Eigenschaften der Objekte, die über das CellSet-Objekt verfügbar sind, sind auch im Offlinezustand verfügbar. 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. Allerdings wird der Befehl im folgenden Beispiel mit einem Aufruf von ExecuteXmlReader ausgeführt, und das Ergebnis wird als System.Xml.XmlReader zurückgegeben. In diesem Beispiel wird das CellSet-Objekt dann mithilfe dieses System.Xml.XmlReader über die LoadXml-Methode aufgefüllt. Obwohl in diesem Beispiel der System.Xml.XmlReader umgehend geladen wird, können Sie das XML, das im Leser vorhanden ist, auf der Festplatte zwischenspeichern oder diese Daten auf beliebige Weise an eine andere Anwendung übergeben, 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
}

Siehe auch

Verweis

Abrufen von Daten von einer analytischen Datenquelle

Abrufen von Daten mittels AdomdDataReader

Abrufen von Daten mittels XmlReader