Chapitre3: Connexion aux BDs
Transcription
Chapitre3: Connexion aux BDs
ADO.NET Activex Database Objet Généralités ADO.NET. Permet d’accéder aux bases de données à partir de VB.NET. ADO veut dire Activex Database Objet . C'est la couche d'accès aux bases de données, le SGBD (Système de Gestion de Base de Données) de VB. ADO.NET à un langage unique pour ouvrir, interroger, modifier plusieurs types de bases de données. Le langage de requête est le SQL. En VB il y a 2 manières d'écrire un programme qui utilise une base de données: - Écrire du code pour créer des objets Ado.net, pour ouvrir la base, pour créer la liaison entre la base et un DataSet avec des critères de sélection écrits en SQL. - Utiliser l’assistant de configuration de source de base de données qui crée les objets et le code à votre place. On peut même lier une table à une liste par exemple qui sera 'remplie' automatiquement par la table (On parle de Binding). 79 ADO.NET Les Managed Providers Pour avoir accès aux données il faut charger les DRIVERS (ou providers). • OLE DB Managed Provider est fourni dans 'System'; après avoir importé le NameSpace System.Data.OLEDB, on peut travailler sur des bases Access par exemple. • SQL Server Managed Provider est fourni dans 'System'; après avoir importé le NameSpace System.Data.SqlClient, on peut travailler sur des bases SqlServer. Exemple, pour travailler sur une base Access, il faudra taper: Imports System.Data.OLEDB 80 ADO.NET Les Objets ADO.NET • Il faut disposer d'un objet Connexion pour avoir accès à la base de données • On met dans la propriété ConnectionString les paramètres de la base de données (nom de la base de données, chemin, mot de passe..). • En fonction de la BD les paramètres sont différents. • Avec la méthode Open on ouvre la base. • Avec la méthodes Close on ferme la base. On peut ensuite travailler de 2 manières: A- On manipule directement la base. (sans retour de résultats) Avec un objet Command on peut manipuler directement la BD (en SQL avec UPDATE, INSERT, DELETE CREATE DROP..), on utilise la propriété ExecuteNonQuery pour cela. 81 ADO.NET B- On envoie une requête Sql 'SELECT' à la base, on récupère le résultat dans un objet. • Avec un objet DataReader on extrait les données en lecture seule: une requête SQL (sur un objet command) charge le DataReader. c'est rapide; on peut lire uniquement les données et aller à l'enregistrement suivant. Il travaille en mode connecté. Pour gérer un DataReader on a besoin d'un objet Command. • Avec un objet DataSet on manipule les données: une requête SQL (sur un objet command) charge le DataSet avec des enregistrements ou des champs, on travaille sur les lignes et colonnes du DataSet en local, en mode déconnecté(une fois que le DataSet est chargé, la connexion à la base de données est libérée). Pour alimenter un DataSet on a besoin d'un objet DataAdapter qui fait l'intermédiaire entre la BD et le DataSet. Noter bien le sens des flèches: • le DataReader est en lecture seule, les données lues dans la BD sont accessibles dans le DataReader. • le DataSet peut lire et écrire des données dans la BD, il faut un DataAdapter en plus de la connexion. • l'objet Command peut modifier la BD. 82 ADO.NET Ce schéma souligne aussi les objets intermédiaires nécessaires: • Un objet connexion dans tous les cas, • Un objet Command pour le DataReader, • Un objet DataAdapter plus un objet Command pour le DataSet . L'objet Command permet d'envoyer des ordres en SQL à la BD et de la modifier, il permet aussi, quand on utilise un DataSet, d'envoyer une requête SELECT en SQL afin de remplir le DataSet avec le résultat de la requête. Enfin certains contrôles comme les DataGrid, les ListBox par exemple peuvent afficher des données à partir d'un DataSet. Pour mettre à jour la base après modification du DataSet ou de la Grid il faut un objet CommandBuilder. Mode connecté ou déconnecté: • Le DataReader fonctionne en mode connecté. La connexion entre la BD et le DataReader est ouverte tant que le DataReader fonctionne. • Le DataSet peut travailler en mode déconnecté: on ouvre la connexion, on charge le DataSet, on ferme la connexion (il faut le faire, ce n'est pas automatique), on travaille sur le DataSet, on peut le réouvrir plus tard pour les mises à jour. 83 ADO.NET Remarque: En fonction du provider, le nom des objets change: • Avec le provider OleDb, après Imports System.Data.OleDb on utilisera OleDbConnexion, OleDbAdapter... • Avec le provider SQL, après Imports System.Data.SqlClient on utilisera SqlConnexion, SqlAdapter... Le DataReader Le DataReader permet donc de lire très rapidement une table, enregistrement par enregistrement, du début à la fin. Il n'y a pas possibilité d'écrire dans la base. Le DataSet Le DataSet a la structure d'une base de données mais en local; il contient: Des DataTable qui contiennent des DataRow et des DataColumn. Pour utiliser DataSet, DataTable, DataRow.. il faut importer l'espace de nom Data: Imports System.Data 84 ADO.NET On peut créer un Dataset de toutes pièces, mais la plupart du temps, on charge le DataSet à partir d'une base de données. Une requête SQL charge le DataSet, on travaille sur les lignes et colonnes du DataSet en local ( sur des enregistrements ou des champs), en mode déconnecté (une fois que le DataSet est chargé, la connexion à la base de données peut être libérée). La structure de données du DataSet reflétera automatiquement et exactement celle des données extraites. Si j'extrais 2 colonnes de données avec l'instruction Sql fournis à l'objet Command, le DataSet aura une table (DataTable) de 2 colonnes avec les données extraites. Exemple : Avec ADO.NET je lance une requête SQL demandant toutes les fiches de la table 'nom' dont le champ 'prénom' est ‘Mohamed', je récupère un DataSet local contenant toutes les fiches (Le DataColumn "Prénom" ne contient que des ‘Mohamed'). Je peux modifier en local le DataSet, (modifier une date de naissance par exemple) et mettre à jour automatiquement la base de données distante. Il existe aussi les DataView qui représentent une vue d'un DataTable. (Un DataView peut contenir un champ d'une table d'un DataSet, ou les enregistrements répondant à un critère). 85 VB.NET Exemple :Etablir une connexion Base Access via VB.net Code : Imports System.Data.OleDb Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Module1.connexion() End Sub End Class Code : Imports System.Data.OleDb Module Module1 Public Sub connexion() Dim cn As New OleDb.OleDbConnection cn = New OleDb.OleDbConnection("provider=Microsoft.jet.oledb.4.0; data source=mabase.mdb") End Sub End Module 86 Exemple complet Me Le mot clé Me permet de faire référence à l'instance spécifique d'une classe ou d'une structure dans laquelle le code s'exécute actuellement. Me se comporte comme une variable objet ou une variable structure faisant référence à l'instance actuelle. L'utilisation de Me est particulièrement utile pour le passage des informations concernant l'instance d'une classe ou d'une structure en cours d'exécution, à une procédure se trouvant dans une autre classe, une autre structure ou un autre module. Focus() Lorsqu'une fenêtre ou un contrôle est actif on dit qu'il a le focus. Un contrôle qui a le focus est celui qui reçoit les évènements clavier, souris.. Comment donner le focus à un contrôle ? Avec la méthode Focus. TxtNom.Focus() Me.txtnom.Focus() Nothing : C’est le mot clef en VB pour null. Exemple: Vérifier si un objet est null en VB.Net, If (items is Nothing) Then 'do stuff End If Update() 'mise à jour des données du dataAdapter(dta)à partir du commandbuilder (cmdb) dta.Update(dts, "table " ) Me.Show 'Shows the form currently executing code 87 Exemple complet Met à jour la base après modification du DataSet 88 Exemple complet Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'ouverture de la connection(à partir du répertoire de l'application) conn = "provider = microsoft.jet.oledb.4.0 ; data source = " & Application.StartupPath & "\employés2.mdb;" cnx = New OleDbConnection cnx.ConnectionString = conn cnx.Open() sql = "select temployés2.* from temployés2" cmd = New OleDbCommand(sql) dta = New OleDbDataAdapter(cmd) cmd.Connection() = cnx 'chargement du DataSet à partir du DataAdapter dta.Fill(dts, "temployés2") 'chargement de la DataTable à partir du DataSet dtt = dts.Tables("temployés2") 'si la table est vide alors If dtt.Rows.Count= 0 Then 'désactivation des boutons pour éviter une erreur si la table est vide btnajou.Enabled = False btnenr.Enabled = True Me.Show() Me.txtnom.Focus() Else 'affichage des données dans les textbox Me.txtref.Text = dtt.Rows(rownum).Item("numemployé") Me.txtnom.Text = dtt.Rows(rownum).Item("nom") Me.txtprenom.Text = dtt.Rows(rownum).Item("prénom") Me.txtjob.Text = dtt.Rows(rownum).Item("emploi") btnenr.Enabled = False End If End Sub 89 Exemple complet Private Sub Form1_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed dts.Clear() cnx.Close() cnx = Nothing End Sub Private Sub btnprec_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnprec.Click 'si début du fichier ou table vide message: sortie de procédure If rownum = 0 Or rownum > dtt.Rows.Count - 1 Then MessageBox.Show("Vous êtes sur le premier enregistrement ou la table ne contient aucun enregistrement !", "Info...", MessageBoxButtons.OK, MessageBoxIcon.Information) Exit Sub End If 'aller à la ligne précédente rownum -= 1 'affichage des données dans les textbox Me.txtref.Text = dtt.Rows(rownum).Item("numemployé") Me.txtnom.Text = dtt.Rows(rownum).Item("nom") Me.txtprenom.Text = dtt.Rows(rownum).Item("prénom") Me.txtjob.Text = dtt.Rows(rownum).Item("emploi") End Sub 90 Exemple complet Private Sub btnsui_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnsui.Click 'si fin du fichier ou table vide message:sortie de procédure If rownum = dtt.Rows.Count - 1 Or rownum > dtt.Rows.Count - 1 Then MessageBox.Show("Vous êtes sur le dernier enregistrement ou la table ne contient aucun enregistrement !", "Info...", MessageBoxButtons.OK, MessageBoxIcon.Information) Exit Sub End If 'aller à la ligne suivante rownum += 1 'affichage des données dans les texbox Me.txtref.Text = dtt.Rows(rownum).Item("numemployé") Me.txtnom.Text = dtt.Rows(rownum).Item("nom") Me.txtprenom.Text = dtt.Rows(rownum).Item("prénom") Me.txtjob.Text = dtt.Rows(rownum).Item("emploi") End Sub 91 Exemple complet Private Sub btnajou_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnajou.Click If btnajou.Text = "Ajouter" Then 'désactivation des boutons de déplacement btnprec.Enabled = False 'précédent btnsui.Enabled = False 'suivant 'activation du bouton valider btnenr.Enabled = True 'vider les textbox Me.txtref.Text = "" Me.txtnom.Text = "" Me.txtprenom.Text = "" Me.txtjob.Text = "" 'changement du texte du bouton pour l'annulation de la procédure Me.btnajou.Text = "Annuler" Else 'si btnajou.text = "Annuler" alors annulation de la procédure d'ajout (pas l'ajout!!) si la table est vide désactivation des boutons If rownum > dtt.Rows.Count - 1 Then btnenr.Enabled = False btnajou.Text = "Ajouter" Else 'aller au début du fichier rownum = 0 'affichage des données dans les textbox Me.txtref.Text = dtt.Rows(rownum).Item("numemployé") Me.txtnom.Text = dtt.Rows(rownum).Item("nom") Me.txtprenom.Text = dtt.Rows(rownum).Item("prénom") Me.txtprenom.Text = dtt.Rows(rownum).Item("emploi") btnenr.Enabled = False btnajou.Text = "Ajouter" 'activation des boutons de déplacement btnprec.Enabled = True 'précédent btnsui.Enabled = True 'suivant End If End If End Sub 92 Exemple complet Private Sub btnenr_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnenr.Click 'si un champ n'est pas rempli fin de procédure If Me.txtnom.Text = "" Or _ Me.txtprenom.Text = "" Or _ Me.txtjob.Text = "" Then MessageBox.Show("Vous devez remplir tous les champs !", "Erreur...", MessageBoxButtons.OK, MessageBoxIcon.Error) Me.txtnom.Focus() Exit Sub End If 'création d'une nouvelle ligne avec les données des textbox dtr = dts.Tables("temployés2").NewRow dtr("nom") = Me.txtnom.Text dtr("prénom") = Me.txtprenom.Text dtr("emploi") = Me.txtjob.Text 'ajout de la ligne dans le DataSet dts.Tables("temployés2").Rows.Add(dtr) 'création et exécution du commandbuilder pour mettre à jour le DataAdapter cmdb = New OleDbCommandBuilder(dta) 'mise à jour des données du DataAdapter à partir du commandbuilder dta.Update(dts, "temployés2") 'on vide le dataset pour le recréer avec les nouvelles données dts.Clear() dta.Fill(dts, "temployés2") dtt = dts.Tables("temployés2") 'aller au début du fichier rownum = 0 'affichage des données dans les texbox Me.txtref.Text = dtt.Rows(rownum).Item("numemployé") Me.txtnom.Text = dtt.Rows(rownum).Item("nom") Me.txtprenom.Text = dtt.Rows(rownum).Item("prénom") Me.txtjob.Text = dtt.Rows(rownum).Item("emploi") 'activation des boutons btnprec.Enabled = True 'précédent btnsui.Enabled = True 'suivant btnajou.Enabled = True btnenr.Enabled = False 'valider btnajou.Text = "Ajouter" End Sub 93 Exercices d’application Exercice 1: Ecrire un programme VB.net permettant d’ajouter le contenu d’une zone de saisie à une zone de texte multi lignes 94 Exercices d’application Exercice 3: Ecrire un programme VB.net permettant de calculer l’IMC (indice de la masse corporelle) 95 Exercices d’application Exercice 1: Ecrire un programme VB.net permettant d’ajouter le contenu d’une zone de saisie à une zone de texte multi lignes Exercice 3: Ecrire un programme VB.net permettant de calculer l’IMC (indice de la masse corporelle) Exercice 2: Ecrire un programme VB.net permettant d’afficher le contenu d’une zone de saisie dans une zone label 96 Exemple complet Exercices d’application txtMultilignes btnAjouter txtAjout Public Class Form1 ' évt btnAjouter_Click Private Sub btnAjouter_Click1(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles btnAjouter.Click ' ajout du contenu de txtAjout à celui de txtMultilignes txtMultilignes.Text &= txtAjout.Text txtAjout.Text = "" End Sub End Class 97 Exemple complet Exercices d’application Public Class Form1 ' clic sur btn quitter Private Sub cmdQuitter_Click(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles cmdQuitter.Click ' clic sur bouton Quitter - on quitte l'application Application.Exit() End Sub ' modification champ txtSaisie Private Sub txtSaisie_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles txtSaisie.TextChanged ' le contenu du TextBox a changé - on le copie dans le Label lblControle lblControle.Text = txtSaisie.Text End Sub ' clic sur btn effacer Private Sub cmdEffacer_Click(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles cmdEffacer.Click ' on efface le contenu de la boîte de saisie txtSaisie.Text = "" End Sub End Class 98 Exemple complet Exercices d’application Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load TextBoxTaille.Text = "" TextBoxPoids.Text = "" labelImc.Text = "" labelPi.Text = "" labelM.Text = "" labelS.Text = "" labelO.Text = "" End Sub Private Sub Quitter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Quitter.Click Me.Close() End Sub 99 Exemple complet Exercices d’application Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim sPoids As Single 'Variable Single contenant le poids Dim sTaille As Single 'Variable Single contenant la taille '******contrôle de validité des entrées************ 'Les valeurs saisies sont-elles numérique? If Not (IsNumeric(TextBoxTaille.Text)) Then MsgBox("Entrez une valeur numérique pour la taille") Exit Sub End If If Not (IsNumeric(TextBoxPoids.Text)) Then MsgBox("Entrez une valeur numérique pour le poids") Exit Sub End If 'Convertir les textes saisis en single ' et les mettre dans les variables sTaille = CType(TextBoxTaille.Text, Single) / 100 sPoids = CType(TextBoxPoids.Text, Single) 'Les valeurs saisies sont-elles cohérentes? If sTaille < 0.5 Or sTaille > 2.5 Then MsgBox("Entrez une taille valide") Exit Sub End If If sPoids < 20 Or sPoids > 200 Then MsgBox("Entrez un poids valide") Exit Sub End If 'Effectuer les calculs et afficher les résultats. labelImc.Text = (Math.Round(sPoids / (sTaille * sTaille), 2)).ToString labelPi.Text = (Math.Round(22 * (sTaille * sTaille), 2)).ToString labelM.Text = (Math.Round(18.5 * (sTaille * sTaille), 2)).ToString labelS.Text = (Math.Round(25 * (sTaille * sTaille), 2)).ToString labelO.Text = (Math.Round(30 * (sTaille * sTaille), 2)).ToString End Sub Arrondi avec 2 chiffres après la virgule 100