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 !

La communication VB .NET - BDD

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

Maintenant que nous avons toutes les clés en main pour pouvoir créer et remplir notre base de données, je pense que vous avez envie de vous amuser un peu avec ? Ça tombe bien, c'est dans ce chapitre que nous allons commencer à interfacer notre code VB.NET et notre base de données fraîchement créée.

Pour cette tâche, nous allons étudier et utiliser un concept spécialement conçu pour ça : ADO.NET.

ADO.NET

ADO.NET (ActiveX Database Objects.NET) est une couche d'accès aux bases de données, c'est un peu le SQL Server Manager de Visual Basic. ADO.NET fournit des modules pour accéder à des BDD de différents types (Access, SQL Server, Oracle, etc.).

Pour le connecter à SQL Server, il faut SQL Server Managed Provider. Il faut donc importer le namespace System.Data.SqlClient pour pouvoir l'utiliser.

Le fonctionnement d'ADO.NET

Créons un projet console pour apprendre le fonctionnement d'ADO.NET.
On effectue donc un Imports :

Imports System.Data.SqlClient

On va différencier trois types d'accès à la BDD :

  • Les accès en lecture unitaire.
    Ces accès seront effectués grace à un objet de type SqlCommand. Cet objet va exécuter une requête sur la BDD (un SELECT par exemple). Puis nous allons nous servir de SqlDataReader, un objet qui va lire la réponse de la BDD à notre précédente requête. Cette combinaison d'objets va nous permettre de lire une petite quantité de données. Cette solution est souvent utilisée pour lire une entrée ou même une seule donnée.

  • Les accès en lecture de masse.
    Ils seront effectués de la même manière que précédemment, seulement la lecture changera. Nous allons utiliser cette fois-ci un SqlDataAdapter permettant d'adapter les données lues pour un objet de type DataSet (comparable à un tableau). Cette méthode sera utile pour récupérer de multiples informations (toute une table par exemple).

  • Les accès en écriture.
    On va uniquement utiliser un objet de type SqlCommand pour exécuter une requête d'insertion de données ou de modification par exemple.

Dans tous les cas, on doit se connecter à la BDD en utilisant un objet de type SqlConnection.

Voici à la figure suivante un schéma pour résumer les trois cas de figure qui se présentent à nous.

Trois cas de figure se présentent à nous
Trois cas de figure se présentent à nous

Connexion à la BDD

Pour ce faire, nous devons générer une chaîne de caractères contenant les informations nécessaires pour se connecter à notre base de données, puis l'utiliser dans un objet de type SqlConnection.

Voici la chaîne de connexion pour notre base de données : "Data Source=localhost;Initial Catalog=SDZ;User Id=sa;Password=*******;".
À modifier si votre base ne s'appelle pas pareil (ici « SDZ ») ; il faut également entrer votre mot de passe.

Création de l'objet de connexion : son constructeur prend en paramètre cette chaîne de connexion, sinon il faut l'assigner manuellement avec un .ConnexionString :

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

Cet objet est donc de type SqlConnection.

Il faut ouvrir la connexion avec la méthode Open().

Connexion.Open()

Il est préférable de mettre l'ouverture de connexion dans un Try… Catch (voir l'annexe de la gestion des erreurs). Ainsi, si le serveur n'est pas accessible pour une raison X ou Y, le programme ne plante pas et on peut gérer l'erreur :

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

Attention, il faut toujours fermer sa connexion à la fin du programme avec un Close() :

Connexion.Close()

… à mettre dans un finally par exemple.

Voilà, vous êtes connectés à votre base de données.

Insertion ou modification

Comme vous l'avez vu, dans tous les cas il faut effectuer une requête grâce à l'objet SqlCommand.

Nous allons donc voir comment générer une requête et l’exécuter. Pour commencer, je souhaiterais ajouter à ma BDD une ligne contenant un nouveau titre.

Je veux ajouter « Hotel California » des Eagles.

La requête SQL est Insert into Musiques(Titre, Artiste) values ('Hotel California', 'Eagles').

Je crée cette requête et mon objet SqlCommand :

Dim Requete As String = "Insert into Musiques(Titre, Artiste) values ('Hotel California', 'Eagles')"
Dim Commande As New SqlCommand(Requete, Connexion)

Puis l'éxécution de la requête s'effectue simplement en faisant appel à la méthode ExecuteNonQuery().

Cette méthode retourne le nombre de lignes affectées par la modification. Dans le cas d'une insertion, ce sera souvent 1. Mais certaines modifications de masses (comme des update) pourront en modifier un grand nombre.

On execute donc la requête (avec un Try… Catch).

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

Et voilà une nouvelle ligne d'insérée en BDD.

Supposons que je veuille attribuer « Album inconnu » à chaque entrée qui n'a pas son album de renseigné, le programme serait :

Imports System.Data.SqlClient

Module Module1

    Sub Main()

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

        Try
            Connexion.Open()

            Dim Requete As String = "UPDATE Musiques SET Album='Album inconnu' WHERE Album is null"
            Dim Commande As New SqlCommand(Requete, Connexion)
            Try
                Console.WriteLine("Il y a eu " & Commande.ExecuteNonQuery() & " lignes mises à jour")
            Catch ex As Exception
                Console.WriteLine(ex.Message)
            End Try

            Commande.Dispose()
            Connexion.Close()

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

    End Sub

End Module

Avec comme résultat console :

Il y a eu 3 lignes mises à jour

Voici le résultat en BDD à la figure suivante.

Le résultat en BDD
Le résultat en BDD

Lecture de données

Maintenant que vous savez exécuter une requête d'ajout ou de modification, on va s'attaquer aux requêtes de lecture. Je souhaiterais connaître l'artiste qui a chanté « Jeune Et Con ».

La requête SQL est SELECT Artiste from Musiques Where Titre = 'Jeune Et Con'.

Je crée cette requête et mon objet SqlCommand :

Dim Requete As String = "SELECT Artiste from Musiques Where Titre = 'Jeune Et Con'"
Dim Commande As New SqlCommand(Requete, Connexion)

Vous voici avec votre commande, prête à être exécutée sur votre base.

Cependant, la manière va différer entre le SqlDataReader et le DataSet. Voyons cela.

Lecture avec SqlDataReader

L'objet de type SqlDataReader va récupérer les données d'une commande SELECT et les emmagasiner. Il va falloir ensuite les lire une par une (donc cet objet est utile lorsqu'on a peu de valeurs ou même une seule).
Pour lui dire de lire la valeur, nous allons utiliser Read().

Puis il faut y accéder en spécifiant le champ que l'on veut lire.

La figure suivante est un schéma pour résumer.

Schéma de fonctionnement du SqlDataReader
Schéma de fonctionnement du SqlDataReader

Utilisons ces informations pour continuer notre code et connaître notre artiste mystère.

On commence par exécuter la commande sur le reader :

Dim MonReader As SqlDataReader = Commande.ExecuteReader()

Puis on teste s'il y a une valeur et on l'affiche :

If MonReader.Read() Then
      Console.WriteLine(MonReader("Artiste").ToString)
Else
      Console.WriteLine("Aucun artiste trouvé")
End If

Et la console nous affiche fièrement :

Saez

La figure suivante est un schéma qui représente ce qu'il s'est passé.

Schéma explicatif de notre exécution
Schéma explicatif de notre exécution
Lecture avec DataSet

Nous allons désormais apprendre à stocker les données récupérées dans un DataSet.
Pour résumer, le DataSet est un objet qui va stocker une image de la base de données, que l'on va pouvoir traiter ultérieurement.
Le chapitre suivant vous apprendra tout ce qu'il y a à savoir sur les DataSet.

Pour le moment, voyons comment récupérer les données.

Il va falloir passer par un adaptateur, cet objet va remplir le DataSet avec la commande que l'on a exécutée.

Je crée donc une requête pour récupérer toute la table Musiques. Je l'applique à un SqlCommand, je l'exécute avec mon SqlAdapter et je crée mon DataSet.

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

Maintenant la ligne magique qui va remplir notre DataSet avec le résultat de la commande :

Adaptateur.Fill(MonDataSet, "Musiques")

Ici, « Musiques » est le nom de la table de mon DataSet dans laquelle je vais stocker les données résultantes de la requête.

Vous voici avec un DataSet rempli par votre table Musiques. Rendez-vous au prochain chapitre pour apprendre comment utiliser notre DataSet et traiter ces données !

  • ADO.NET permet l'accès rapide aux données, son utilisation peut cependant devenir laborieuse sur de grandes tables.

  • On se connecte à la BDD en définissant une SqlConnection et une chaîne de connexion.

  • On exécute des requêtes SQL avec ExecuteNonQuery.

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