Récupération de données à l'aide d'un ensemble de cellules

Lors de la récupération de données analytiques, l'objet CellSet procure une interactivité et une souplesse optimales. L'objet CellSet est un cache de données et métadonnées hiérarchiques en mémoire qui préserve la dimensionnalité des données. L'objet CellSet peut également être parcouru en état connecté ou déconnecté. Du fait de cette aptitude en état déconnecté, l'objet CellSet peut être utilisé pour consulter les données et les métadonnées dans n'importe quel ordre et constitue le modèle objet le plus complet pour la récupération de données. Autre conséquence de cette aptitude en état déconnecté : l'objet CellSet subit une charge maximale, et il s'agit du modèle objet de récupération de données ADOMD.NET le plus long à remplir.

Récupération de données en état connecté

Pour utiliser l'objet CellSet afin de récupérer des données, procédez comme suit :

  1. Créez une nouvelle instance de l'objet.

    Pour créer une nouvelle instance de l'objet CellSet, vous devez appeler la méthode Execute ou ExecuteCellSet de l'objet AdomdCommand.

  2. Identifiez les métadonnées.

    En plus de récupérer les données, ADOMD.NET récupère également les métadonnées pour l'ensemble de cellules. Dès que la commande a exécuté la requête et a retourné un objet CellSet, vous pouvez récupérer les métadonnées par le biais de différents objets. Ces métadonnées sont nécessaires aux applications clientes en vue d'afficher et d'interagir avec les données d'ensemble de cellules. Par exemple, de nombreuses applications clientes proposent des fonctionnalités qui permettent d'explorer vers le bas une position spécifiée dans un ensemble de cellules, c'est-à-dire, d'en afficher hiérarchiquement les positions enfants.

    Dans ADOMD.NET, les propriétés Axes et FilterAxis de l'objet CellSet représentent les métadonnées des axes de requête et de secteur, respectivement, dans l'ensemble de cellules retourné. Ces deux propriétés retournent des références à des objets Axis, qui de leur côté contiennent les positions représentées sur chaque axe.

    Chaque objet Axis contient une collection d'objets Position qui représentent l'ensemble de tuples disponibles pour l'axe en question. Chaque objet Position représente un tuple unique qui contient un ou plusieurs membres, représenté(s) par une collection d'objets Member.

  3. Récupérez les données de la collection d'ensembles de cellules.

    En plus de récupérer les métadonnées, ADOMD.NET récupère également les données pour l'ensemble de cellules. Dès que la commande a exécuté la requête et a retourné un CellSet, vous pouvez récupérer les données en utilisant la collection Cells de l'objet CellSet. Cette collection contient les valeurs calculées pour l'intersection de tous les axes de la requête. Par conséquent, il existe plusieurs indexeurs pour accéder à chaque intersection (ou cellule). Pour obtenir une liste d'indexeurs, consultez Item.

Exemple de récupération de données en état connecté

L'exemple suivant établit une connexion au serveur local, puis exécute une commande sur la connexion. Il analyse les résultats à l'aide du modèle objet CellSet : les légendes (métadonnées) des colonnes sont récupérées à partir du premier axe, tandis que les légendes (métadonnées) de chaque ligne sont récupérées à partir du deuxième axe. Enfin, les données d'intersection sont récupérées par l'intermédiaire de la collection 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
}

Récupération de données en état déconnecté

En chargeant les données XML retournées par une requête précédente, vous pouvez utiliser l'objet CellSet pour fournir une méthode complète d'exploration des données analytiques sans qu'il soit nécessaire de disposer d'une connexion active.

[!REMARQUE]

En état déconnecté, certaines propriétés des objets disponibles à partir de l'objet CellSet ne sont pas disponibles. Pour plus d'informations, consultez LoadXml.

Exemple de récupération de données en état déconnecté

L'exemple suivant est similaire à l'exemple de métadonnées et de données présenté précédemment dans cette rubrique. Toutefois, dans cet exemple, la commande est exécutée avec un appel à ExecuteXmlReader, et le résultat est retourné sous forme de System.Xml.XmlReader. L'exemple remplit ensuite l'objet CellSet en utilisant ce System.Xml.XmlReader avec la méthode LoadXml. Bien que cet exemple charge immédiatement le System.Xml.XmlReader, vous pouvez mettre en cache les données XML contenues dans le lecteur sur un disque dur ou les transporter vers une autre application par quelque moyen que ce soit avant de les charger dans un ensemble de cellules.

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
}