Renaud Harduin
ADOMD.Net : Accès aux bases multidimensionnelles (et présentation avec DataGridView)
L'objet de cet article est de présenter comment se fait l'accès aux données de cube via ADOMD.Net qui est aux bases multidimensionnelles ce qu'est ADO
Par Renaud Harduin publié le 17/04/2006 à 22:44, lu 7287 fois, 5 pages
 2 | I - ADOMD.Net
Téléchargez le code source - 111 Kb
I - ADOMD.Net
1.1 - Architecture du projet MyADOMD
Vous trouverez en téléchargement la solution MyADOMD


La solution MyADOMD est composée de 2 projets :
  1. Une couche Applicative dans laquelle nous afficherons nos données :
  2. Une couche de façade pour lisser l'accès aux cubes et faire évoluer facilement notre application. Dans le détail, c'est dans la couche façade où nous créons une référence à ADOMD.Net (création d'une référence vers Microsoft.AnalysisServices.AdomdClient) pour accéder aux données du cube.
1.2 - Survol d'ADOMD.Net
Les objets significatifs sont :
  1. AdomdCommand qui représente une commande à exécuter dans notre source
  2. AdomdConnection qui représente une connexion à notre source multidimensionnelle
  3. AdomdAdapter qui sera utilisé pour retrouver les données à l'image de ce que l'on fait avec un adapter classique
  4. AdomdDataReader qui nous fournis un reader sur les données

L'ensemble est accompagné d'un jeu d'API permettant de retrouver de l'information sur un cube, ses hiérarchies ainsi qu'une classe CellSet qui contient les données de notre requête ainsi que les métadonnées associées
1.2 – Mise en oeuvre basique
Comme vous l'aurez peut être remarqué dans la capture d'écran de mon interface, nous disposons de 3 boutons permettant une mise en forme plus ou moins avancée.
Nous commençons par la version « basique » du requêtage et de la restitution.

En premier lieu, il convient d'implémenter la logique de connexion. Cela se fait bien entendu dans la façade par l'implémentation d'une méthode Connect :
public ConnectionState   Connect(string connString )
        {

            this.ConnectionString = connString;
            _mdConn = new AdomdConnection(this.ConnectionString);
            _mdConn.Open();
            return _mdConn.State;

        }

Cette méthode admettra une chaine de connexion que nous gérons sous forme de constante dans l'UI :

private const string C_CONNECTIONSTRING = @"Provider=MSOLAP.3;Cache Authentication=False;Integrated Security=SSPI;
Persist Security Info=False;Initial Catalog=Analysis Services Tutorial;Data Source=.\BILAB;
Impersonation Level=Impersonate;Mode=ReadWrite;Auto Synch Period=20000;
Default Isolation Mode=0;Default MDX Visual Mode=0;MDX Compatibility=0;MDX Unique Name Style=0;
Non Empty Threshold=0;SQLQueryMode=Calculated;Safety Options=1;Secured Cell Value=0;SQL Compatibility=0;
Compression Level=0;Real Time Olap=False;Packet Size=4096";

Il s'agit d'une chaîne de connexion classique OLEDB prenant en compte un provider MSOLAP.3 (on pourra donc utiliser d'autres provider pour d'autres sources).
Nous appelons la méthode de connexion au lancement de l'application :
public MyDADOMD()
{
 InitializeComponent();

 /* Connection */
 _mdFacade.Connect(C_CONNECTIONSTRING);

}

En première implémentation des méthodes de requêtage, nous allons utiliser l'appel au AdomdDataAdapter tel qu'on le ferait en ADO.NET afin d'obtenir un Dataset dans une méthode getDataSet dans la façade :
public DataSet getDataset(string p_mdxQuery)
{
 DataSet m_ds = new DataSet();

 AdomdCommand m_cmd = new AdomdCommand(p_mdxQuery, _mdConn);
 AdomdDataAdapter m_adpt = new AdomdDataAdapter(m_cmd);
 int nbOfRows = m_adpt.Fill(m_ds);
 return m_ds;
}

On crée donc une commande à partir d'une requête MDX et d'une connexion (vous trouverez les requêtes dans le projet ci-joint). Nous créons ensuite un AdomdAdapter à partir de cette commande dont nous nous servons pour charger (fill) le DataSet.
L'appel de l'ensemble de ces méthodes se fait lors du click sur le bouton « Basic Grid » par un simple bind d'une source :
#region Basic Grid
private void button1_Click(object sender, EventArgs e)
{
 DgvCube.DataSource = null;
 DataSet m_ds = new DataSet();
 m_ds = _mdFacade.getDataset(C_MDXQUERY);
 DgvCube.DataSource = m_ds.Tables[0];
DgvCube.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
 DgvCube.Refresh();
}
#endregion 
Le résultat de notre requête :



La représentation reste tout de même assez « aride » dans la mesure où l'on reproduit basiquement de manière bidimensionnelle (entendre non hiérarchique) les données du cube. A cela, je préfère l'utilisation de CellSet qui permet, du fait des métadonnées, une présentation plus adaptée.
 
» Démarrer une discussion