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

Documents pareils