• 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 !

Mis à jour le 20/12/2017

TP : ZBiblio V2

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

Mettons en pratique notre travail sur les BDD en faisant un petit TP sur le sujet. Vous vous souvenez de notre TP ZBiblio ? Nous allons tenter d'améliorer notre petit logiciel afin d'intégrer la notion de base de données dans ce dernier.

Je vais avoir besoin de vous en pleine forme pour mener à bien ce petit travail alors allez vous chercher un café et attaquons !

Cahier des charges

Vous vous souvenez de notre TP ZBiblio ? Nous allons tenter d'améliorer notre petit logiciel afin d'intégrer la notion de base de données dans ce dernier.

Dans notre première version de la bibliothèque de films, nous utilisions la sérialisation pour stocker les informations sous forme de fichier. Cette méthode a des avantages (notamment la mise en place très simple sur un PC en local de la méthode de type sérialisation) et des inconvénients.

Une base de données n'est pas vraiment adaptée pour un logiciel individuel fonctionnant uniquement en local sur une seule et unique machine. Cependant, si vous souhaitez partager votre base de données de films afin de créer une bibliothèque collaborative, ce TP va vous enseigner les fondements pour effectuer ces modifications.

Résumons. Le logiciel de bibliothèque ne va plus devoir écrire et lire dans un fichier, mais dans une base de données. Cette BDD peut être locale ou distante. Avoir une BDD locale perd un peu de son intérêt, mais nous allons faire de cette manière pour ce TP. Libre à vous après de modifier l'adresse de votre BDD par une adresse de serveur contenant cette dernière et de diffuser votre logiciel (à votre famille ou vos amis afin de partager la même bibliothèque avec d'autres personnes).

Dans ce TP, nous n'allons pas implémenter la notion de droits, ainsi, chaque utilisateur du logiciel pourra :

  • Consulter une fiche de film ;

  • Créer une fiche de film ;

  • Modifier ou supprimer une fiche de film.

La structure du logiciel restera la même, les enregistrements serons justes différents.

Qui dit base de données dit conception de cette dernière. À vous de créer la table avec les champs requis pour stocker toutes les informations de notre fiche de films.

Deux particularités à prendre en compte lors de l'insertion de données en BDD :

  • Pour écrire une date dans un champ DATE de SQL, vous devez formater cette dernière en utilisant : ToString("yyyy-MM-dd"). Cette fonction formatera la date pour qu'elle soit insérée sans problèmes en BDD.

  • Dans des chaînes de caractères, il peut y avoir des apostrophes : « ' », cependant, ce caractère est utilisé dans des requêtes SQL pour délimiter le début et la fin de chaînes de caractères. Donc si une apostrophe est au milieu de votre mot, il sera coupé, et provoquera une erreur de surcroît. Pour éviter cette erreur, utilisez une fonction pour « doubler » les apostrophes de vos chaînes de caractères : « ' » => « '' ».

Je recommande à tous ceux qui ne se sentent pas sûrs d'eux pour le premier TP de réutiliser le projet fonctionnel que j'ai fait en le téléchargeant.

Je ne vous en dit pas plus, à vos claviers les Zéros ! Et bonne chance.

Correction : partie BDD

Passons à la correction.

Tout d'abord, réfléchissons à la structure de données de notre table.

Un champ de type ID sera utilisé pour référencer chaque film et pouvoir modifier ou supprimer rapidement un film. Ainsi, pour le supprimer, je n'aurai qu'à effectuer un DELETE… WHERE ID = X.
Ce champ ID sera une clé primaire et auto-incrémentale.
Ces deux mots barbares sont juste là pour dire que :

  • Ce champ sera unique ;

  • Il sera incrémenté automatiquement de 1 à chaque enregistrement.

Ainsi, nous n'avons pas besoin de nous en soucier, il sera créé tout seul et à la bonne valeur quand nous ajouterons un film.

Les autres champs ne devraient pas poser de problème, ce sont tous des chaînes de caractères. J'ai utilisé le type nvarchar avec des valeurs maximum cohérentes.
L'avis personnel et le synopsis sont des types Text. Ce type ne limitant théoriquement pas le nombre de caractères possibles dans le champ.
La date de sortie est un type Date et la note personnelle un int.

Je vous donne ma requête de création de table pour ceux qui auraient déjà été bloqués à cette partie :

USE [SDZ]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[ZBiblio](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[NOM] [nvarchar](50) NOT NULL,
	[DATE_SORTIE] [date] NULL,
	[REALISATEUR] [nvarchar](50) NULL,
	[GENRE1] [nvarchar](50) NULL,
	[GENRE2] [nvarchar](50) NULL,
	[ACTEURS] [nvarchar](200) NULL,
	[SYNOPSIS] [text] NULL,
	[AVIS_PERSONNEL] [text] NULL,
	[NOTE_PERSONNELLE] [int] NULL,
	[AFFICHE] [nvarchar](255) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

Correction : partie VB

Concernant la partie VB, il n'y a pas énormément de changements, toute la structure est la même.

Il faut cependant intégrer toutes nos requêtes vers la base de données où on accédait précédemment à la classe Film.

Connexion

Commençons avec la chaîne de connexion :

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

Je l'ai mise en champ public de la class ZBiblio pour pouvoir y accéder depuis la fenêtre de création et modification.

Dans le chargement du programme, intégrons la connexion à la base de données :

'Tentative de connexion à la BDD
        Try
            Connexion.Open()
        Catch ex As Exception
            MessageBox.Show("Erreur lors de la connexion à la BDD ... Vérifiez votre connexion ou contactez votre administrateur..", "ERREUR", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Me.Close()
        End Try

Récupération

Ma méthode UpdateListe aura pour but de récupérer les données en BDD et de mettre à jour la liste.
Ainsi :

Public Sub UpdateListe()
        RecuperationListeFilms() 'On récupère les informations en BDD
        'On vide la liste et on la reremplit
        Me.LB_LISTE_FILMS.Items.Clear()
        'Parcourt les films de la bibliothèque
        For Each FilmALister As Film In _ListeFilms
            'Remplit la liste en se basant sur le nom (vu que j'ai surchargé tostring)
            'A le même effet que FilmALister.Nom sans la surcharge.
            Me.LB_LISTE_FILMS.Items.Add(FilmALister)
        Next
    End Sub

Avec la méthode RecuperationListeFilms :

Private Sub RecuperationListeFilms()
        _ListeFilms.Clear() 'On nettoie la liste

        'Recupère la liste en BDD
        Dim Requete As String = "SELECT * from ZBiblio" ' Récupère tous les films de la table

        Try
            Dim Commande As New SqlCommand(Requete, Connexion)
            Dim MonReader As SqlDataReader = Commande.ExecuteReader()
            While MonReader.Read() 'Lit chaque film en BDD et crée un objet Film avec les informations
                _ListeFilms.Add(New Film(MonReader("ID").ToString, MonReader("NOM").ToString, CDate(MonReader("DATE_SORTIE").ToString), MonReader("REALISATEUR").ToString, MonReader("GENRE1").ToString, MonReader("GENRE2").ToString, MonReader("ACTEURS").ToString, MonReader("SYNOPSIS").ToString, MonReader("AVIS_PERSONNEL").ToString, MonReader("NOTE_PERSONNELLE").ToString))
            End While
            Commande.Dispose()
            MonReader.Close()
        Catch ex As Exception
            MessageBox.Show("Erreur lors de la récupération des données EN BDD ... Contactez votre administrateur.", "ERREUR", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Me.Close()
        End Try

    End Sub

Arrivés à ce stade, nous avons nos données récupérées et affichées dans la liste.

Passons maintenant aux phases d'ajout, de modification et du suppression

Suppression d'une fiche

La phase de suppression s'effectue toujours lors du clic sur Supprimer la fiche du film. Sauf qu'il faut désormais intégrer la notion de requête à la base de données, puis terminer par une mise à jour de la liste.

Ce qui donne :

Private Sub BT_SUPPRIMER_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_SUPPRIMER.Click
        If Not _FilmEnVisualisation Is Nothing Then 'Si un film est sélectionné
            'Confirmation
            If MsgBox("Etes vous certain de vouloir supprimer ce film ?", vbYesNo, "Confirmation") Then
                'On le supprime en BDD
                Dim Requete As String = "DELETE FROM ZBiblio WHERE ID=" & _FilmEnVisualisation.ID
                Dim Commande As New SqlCommand(Requete, Connexion)
                Try
                    Commande.ExecuteNonQuery()
                Catch ex As Exception
                    MessageBox.Show("Erreur lors de la suppression des données EN BDD ... Contactez votre administrateur.", "ERREUR", MessageBoxButtons.OK, MessageBoxIcon.Error)
                End Try
                Commande.Dispose()
            End If

            'MAJ
            UpdateListe()
        Else
            MsgBox("Selectionnez d'abord un film", vbOK, "Erreur")
        End If
    End Sub

L'ID nous est utile ici pour accéder sans ambiguïté au film que nous souhaitons supprimer (je rappelle que l'ID est unique).

Modification et ajout

Ces deux opérations seront effectuées dans la fenêtre Fiche film.
En effet, souvenez-vous de la correction de l'ancien TP, si une fiche de film était passée en paramètre lors de l'ouverture de cette fenêtre, cela signifiait que l'utilisateur souhaitait modifier la fiche, sinon cela indiquait qu'il fallait en créer une nouvelle.
Nous allons donc simplement intégrer nos requêtes SQL à ces emplacements.
Puisque nous avons créé la variable Connexion en public, nous pouvons y accéder depuis cette fenêtre, et donc ne pas la réécrire :

Private Sub BT_SAVE_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_SAVE.Click
        Dim DATE_SORTIE As String = Me.DT_DATE_SORTIE.ToString("yyyy-MM-dd") 'Formate la date pour la BDD
        If _FilmAModifier Is Nothing Then
            'Enregistre notre film en BDD
            Dim Requete As String = "Insert into ZBiblio(NOM, DATE_SORTIE, REALISATEUR, GENRE1, GENRE2, ACTEURS, SYNOPSIS, AVIS_PERSONNEL, NOTE_PERSONNELLE) values ('" & FormatString(Me.TXT_NOM.Text) & "','" & DATE_SORTIE & "','" & FormatString(Me.DDL_REALISATEUR.Text) & "','" & FormatString(Me.DDL_GENRE1.Text) & "','" & FormatString(Me.DDL_GENRE2.Text) & "','" & FormatString(Me.TXT_ACTEURS.Text) & "','" & FormatString(Me.TXT_SYNOPSIS.Text) & "','" & FormatString(Me.TXT_AVIS_PERSONNEL.Text) & "'," & Me.NUM_NOTE_PERSO.Value & ")"
            Dim Commande As New SqlCommand(Requete, ZBiblio.Connexion)
            Try
                Commande.ExecuteNonQuery()
                MsgBox("Fiche correctement crée", vbOKOnly, "Confirmation")
            Catch ex As Exception
                MessageBox.Show(ex.ToString & "Erreur lors de l'ajout d'un film EN BDD ... Contactez votre administrateur.", "ERREUR", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try

        Else
            'Sinon on le modifie en récupérant son index dans la liste de la fenêtre parent
            Dim Requete As String = "UPDATE ZBiblio SET NOM='" & FormatString(Me.TXT_NOM.Text) & "', DATE_SORTIE='" & DATE_SORTIE.ToString("yyyy-MM-dd") & "', REALISATEUR='" & FormatString(Me.DDL_REALISATEUR.Text) & "', GENRE1='" & FormatString(Me.DDL_GENRE1.Text) & "', GENRE2='" & FormatString(Me.DDL_GENRE2.Text) & "', ACTEURS='" & FormatString(Me.TXT_ACTEURS.Text) & "', SYNOPSIS='" & FormatString(Me.TXT_SYNOPSIS.Text) & "', AVIS_PERSONNEL='" & FormatString(Me.TXT_AVIS_PERSONNEL.Text) & "', NOTE_PERSONNELLE=" & Me.NUM_NOTE_PERSO.Value & " WHERE ID=" & _FilmAModifier.ID
            Dim Commande As New SqlCommand(Requete, ZBiblio.Connexion)
            Try
                Commande.ExecuteNonQuery()
                MsgBox("Fiche correctement modifiée", vbOKOnly, "Confirmation")
            Catch ex As Exception
                MessageBox.Show("Erreur lors de la modification d'un film EN BDD ... Contactez votre administrateur.", "ERREUR", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        End If

        'MAJ de la liste dans la fenêtre parent
        ZBiblio.UpdateListe()
        'Ferme la fenêtre d'édition
        Me.Close()
    End Sub

Vous remarquez que je me sers de la fonction FormatString. Cette fonction est relativement simple :

Private Function FormatString(ByVal val As String) As String
        Return val.Replace("'", "''")
    End Function

Tout est là. Après, si vous avez suivi le tuto jusqu'ici, je pense que vous êtes aptes à modifier et adapter le code en fonction de vos besoins.

Conclusion

Pour conclure, je ne vous le rappellerai jamais assez, la programmation c'est avant tout de la recherche, de l'expérimentation et des erreurs…
À vous d'adapter ce code suivant vos besoins, il est même possible que votre bibliothèque fonctionne totalement différemment de celle présentée lors de ce TP, chaque développeur structure son programme à sa manière.

Il n'y a pas de bonne ou de mauvaises réponses, surtout pas en VB ! :)

Améliorations

Quelques pistes de recherche pour vous, amis Zeros :

  • Implémenter toute la structure pour les affiches, le stockage en BDD, l'ajout, etc. Vous pouvez utiliser la structure de champ Image en base de données ou alors stocker son chemin (URL vers le .jpg par exemple…).

  • Améliorer un peu le design. :)

  • Créer un scrapper, un module qui irait chercher les informations de chaque film sur Allociné pour remplir la fiche.

  • Etc.

  • Voilà la mise à jour du logiciel ZBiblio pour utiliser la base de données.

  • Gardez ce TP pour avoir les exemples de création SQL d'une BDD.

  • Il vous sera également utile pour la récupération et l'écriture simple à une BDD.

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