Mis à jour le mardi 23 mai 2017
  • 20 heures
  • Facile

Ce cours est visible gratuitement en ligne.

Ce cours existe en livre papier.

Vous pouvez être accompagné et mentoré par un professeur particulier par visioconférence sur ce cours.

J'ai tout compris !

Le DataSet à la loupe

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

L'ADO.NET c'est bien beau mais ça nous limite assez vite. En effet, pour de très grandes requêtes, il va falloir itérer sur l'intégralité des résultats avant d'avoir la valeur recherchée.

Imaginons maintenant que nous n'ayons plus à manipuler manuellement les données récupérées mais que des objets aient été conçus spécialement pour contenir des « Bases de données ». Je l'écris entre guillemets car on n'a aucun intérêt à stocker l'ensemble de notre base dans un objet. Par contre on va pouvoir récupérer les résultats et les manipuler plus aisément que précédemment. Cet objet existe et s'appelle un dataset, allons le découvrir.

Qu'est-ce ?

Un DataSet, pour résumer, est une représentation d'une base de données sous forme d'objet. Il contient des tables, elles-mêmes contiennent des colonnes et des lignes. On pourrait le schématiser par la figure suivante.

Schéma d'un DataSet
Schéma d'un DataSet
  • Les différentes tables sont des objets de type DataTable.

  • Les colonnes sont des objets de type DataColumn.

  • Et les lignes, des DataRow.

Nous avons donc des tables de type DataTable qui sont des éléments du DataSet. On y accède soit par leur index (un peu comme un tableau), soit avec le nom de la table (préférable pour être certain de la table à laquelle on accède).

Puis viennent les lignes et les colonnes, respectivement des DataRow et des DataColumn, qui sont des éléments d'une DataTable. Si on y accède en utilisant un index, on récupère la ligne ou la colonne souhaitée, sinon c'est une collection contenant la liste des lignes ou la liste des colonnes qui est renvoyée.

Et finalement, on a les items, dernier maillon de la chaîne, chacun d'entre eux contient un élément unique. Ce sont donc des DataItems, ce sont des éléments de DataRow. Ce sont eux qui contiennent notre donnée.

Nous allons mettre tout ça au clair par des exemples.

La lecture de données

Pour apprendre à lire nos données nous allons réutiliser la commande SQL du chapitre précédent permettant de récupérer l'ensemble de la table Musiques.

Imports System.Data.SqlClient

Module Module1

    Sub Main()

        Dim Connexion As New SqlConnection("Data Source=localhost;Initial Catalog=SDZ;User Id=sa;Password=v3vk4pgd;")

        Try
            Connexion.Open()

            Dim Requete As String = "SELECT * from Musiques"
            Dim Commande As New SqlCommand(Requete, Connexion)
            Dim Adaptateur As New SqlDataAdapter(Commande)
            Dim MonDataSet As New DataSet
            Try
                Adaptateur.Fill(MonDataSet, "Musiques")

                'Analyse du DataSet

            Catch ex As Exception
                Console.WriteLine(ex.Message)
            End Try

        Catch ex As Exception
            Console.WriteLine(ex.Message)
        End Try

    End Sub

End Module

On considère donc que les données sont récupérées et prêtes à être analysées où il y a écrit 'Analyse du DataSet.

Je vous avait dit que lors du remplissage des données le second argument spécifiait le nom de la DataTable que l'on a créée.

Ainsi, pour accéder au premier artiste de notre table, on utilise :

MonDataSet.Tables("Musiques").Rows(0).Item("Artiste").ToString

J'accède donc à la colonne avec le nom « Artiste » de la ligne n°0 de la table Musiques. Dur à suivre ! Mais une fois que vous aurez compris, tout ira mieux !

Des simplifications existent :

MonDataSet.Tables("Musiques")(0)("Artiste")

Ce code aura le même effet que la précédente instruction. On peut s'affranchir des mots-clés Rows et Item.

Utilisons For Each

Vous vous souvenez de For Each ? Permettant de parcourir toutes les cases d'un tableau par exemple ?
Eh bien utilisons cette boucle pour parcourir toutes nos lignes !

'Analyse du DataSet
For Each Ligne As DataRow In MonDataSet.Tables("Musiques").Rows()
       Console.WriteLine(Ligne("Artiste").ToString & " - " & Ligne("Titre").ToString)
Next

Et voici un listing des musiques et de leur artiste.

Comme je vous le disais, MonDataSet.Tables("Musiques").Rows() renvoie une collection. Et une collection, au même titre qu'un tableau, a des éléments, on peut donc y accéder avec For Each.

Lecture plus poussée

Vous savez désormais effectuer une lecture de chaque ligne, chaque colonne, chaque case de votre table.
Nous allons attaquer les views.

« View » signifie « vue » en français. On va donc générer à partir de notre DataSet des vues de la table. Ces vues sont pratiques, car on va pouvoir les modifier pour, par exemple, trier une certaine colonne par ordre alphabétique, etc.

Cet objet peut être utile lorsque vous avez de nombreux affichages différents à faire de votre Table. Plutôt que de faire des dizaines de requêtes SQL à la BDD, on en fait une seule en rapatriant la table souhaitée dans un DataSet, puis on effectue les différents affichages souhaités avec des DataView.

Pour créer un DataView on peut passer en paramètre du constructeur la table voulue à laquelle lier la vue. Je vais donc lui passer la table Musiques :

Dim MonView As New DataView(MonDataSet.Tables("Musiques"))

Puis on effectue des modification sur la view.

Tri

Le tri est la propriété Sort du DataView. On va l'utiliser avec la même syntaxe que le tri SQL, en spécifiant le champ suivant lequel trier et l'ordre (ASC pour ordre croissant et DESC pour décroissant).

Ainsi, si je veux trier suivant le champ Artiste et afficher le résultat :

MonView.Sort = "Artiste ASC" 'On trie les artistes par ordre croissant
For Each Ligne As DataRowView In MonView
     Console.WriteLine(Ligne("Titre") & " - " & Ligne("Artiste"))
Next
Filtre

Le filtre s'utilise avec la propriété RowFilter. On spécifie le champ à filtrer et la valeur voulue.

Si je veux afficher uniquement les entrées où l'album est inconnu :

MonView.RowFilter = "Album = 'Album inconnu'"
La recherche

Pour effectuer une recherche sur un champ, il faut déjà spécifier un tri du DataView avec la commande Sort. Cela indiquera au DataView dans quel champ effectuer la recherche.

Puis FindRow permettra de rechercher la valeur souhaitée. Cela retournera une collection de RowView (car il peut y avoir plusieurs fois la même valeur). On peut donc réutiliser un For Each pour afficher les résultats.

MonView.Sort = "Artiste ASC"
For Each Ligne As DataRowView In MonView.FindRows("Saez")
     Console.WriteLine(Ligne("Titre") & " - " & Ligne("Artiste"))
Next

L'ajout de données

Un DataSet est fait pour être lié à la BDD, cependant il vous est tout à fait possible de créer le vôtre de toutes pièces pour un programme sans liaison à la BDD. Pour substituer à un tableau par exemple.

On a déjà vu chacun des éléments composant le DataSet, on va donc en créer un avec les même données que notre BDD pour nous entraîner.

Donc, commençons par créer une table à notre DataSet :

Dim MonDataSet As New DataSet
MonDataSet.Tables.Add("Musiques")

Maintenant, attaquons-nous à la création de colonnes.

Comme pour tout, vous avez le choix entre la création séparée d'un objet de type DataColumn, puis l'ajout en vous servant de cet objet, ou entrer directement les paramètres voulus dans le constructeur :

'Création d'un objet de type DataColumn
Dim MaColonne As New DataColumn
MaColonne.ColumnName = "Titre"
MaColonne.DataType = GetType(String)
MonDataSet.Tables("Musiques").Columns.Add(MaColonne)
'Utilisation du constructeur
MonDataSet.Tables("Musiques").Columns.Add("Artiste", GetType(String))
MonDataSet.Tables("Musiques").Columns.Add("Album", GetType(String))
MonDataSet.Tables("Musiques").Columns.Add("Classement", GetType(Integer))

Et finalement, après la construction de notre structure, on peut ajouter des données.

Comme vous l'avez surement deviné, cela s'effectue avec la méthode MonDataSet.Tables("Musiques").Rows.Add.
On lui passe en paramètre soit une DataRow construite au préalable, soit plus simplement une collection d'objets à ajouter.

Exemple, si je veux ajouter un titre à mon DataSet :

MonDataSet.Tables("Musiques").Rows.Add("Nothing Else Matters", "Metallica", "Metallica", 9)

Donc si je veux ne pas mettre d'album, je dois quand même spécifier l'argument en le mettant vide :

MonDataSet.Tables("Musiques").Rows.Add("Hotel California", "Eagles", "", 8)
'Le mot-clé « nothing » (équivalent de NULL) fonctionne aussi
MonDataSet.Tables("Musiques").Rows.Add("Hotel California", "Eagles", Nothing, 8)

Vous voilà donc avec un DataSet créé de toutes pièces et sur lequel vous allez pouvoir effectuer les traitements vus précédemment (DataView, puis tri, etc.).

  • Le DataSet est un tableau destiné à contenir une base de données.

  • Attention à son utilisation, la quantité de mémoire qu'il requiert peut vite devenir excessive.

  • C'est l'objet idéal si on sait que les données ne vont pas changer au cours de l'utilisation du logiciel.

Exemple de certificat de réussite
Exemple de certificat de réussite