ADO.NET
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.
Généralités
Activex Database Objet
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).
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
80
•
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
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.
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
82
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.
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.
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
84
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 DataRowet des DataColumn.
Pour utiliser DataSet, DataTable, DataRow.. il faut importer l'espace de nom Data: Imports System.Data
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.
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).
VB.NET
Exemple
:Etablir une connexion Base Access via VB.netCode :
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
86
End Sub End Class Code : Imports System.Data.OleDb Module Module1Public Sub connexion()
Dim cn As New
OleDb.OleDbConnection
cn = New OleDb.OleDbConnection("provider=Microsoft.jet.oledb.4.0; data source=mabase.mdb") End Sub
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()
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 " )
Exemple complet
Met à jour la base après modification du DataSet
Exemple complet
Private SubForm1_Load(ByValsender AsSystem.Object, ByVale AsSystem.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 = NewOleDbConnection cnx.ConnectionString = conn cnx.Open()
sql = "select temployés2.* from temployés2"
cmd = New OleDbCommand(sql) dta = NewOleDbDataAdapter(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")
89
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
Exemple complet
Private Sub Form1_Closed(ByValsenderAs Object, ByValeAsSystem.EventArgs)Handles MyBase.Closed dts.Clear()
cnx.Close() cnx =Nothing End Sub
Private Sub btnprec_Click(ByValsender As System.Object, ByVale As System.EventArgs) Handles btnprec.Click
'si début du fichier ou table vide message: sortie de procédure Ifrownum = 0 Or rownum > dtt.Rows.Count - 1 Then
90
Ifrownum = 0 Or rownum > dtt.Rows.Count - 1 ThenMessageBox.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")
Exemple complet
Private Sub btnsui_Click(ByValsender As System.Object, ByVale As System.EventArgs) Handles btnsui.Click
'si fin du fichier ou table vide message:sortie de procédure
Ifrownum = dtt.Rows.Count - 1 Orrownum > 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 '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")
Exemple complet
Private Subbtnajou_Click(ByValsender AsSystem.Object, ByVale AsSystem.EventArgs) Handlesbtnajou.Click
Ifbtnajou.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
Ifrownum > dtt.Rows.Count - 1 Then
92
Ifrownum > 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
Exemple complet
Private Subbtnenr_Click(ByValsender AsSystem.Object, ByVale AsSystem.EventArgs) Handlesbtnenr.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 = NewOleDbCommandBuilder(dta)
'mise à jour des données du DataAdapter à partir du commandbuilder '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"
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
Exercices d’application
Exercice 3:
Ecrire un programme VB.net
permettant de calculer l’IMC
(indice de la
masse corporelle)
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)
96
Exercice 2: Ecrire un programme VB.net permettant d’afficher le
Exemple complet
Exercices d’application
txtMultilignes
btnAjouter
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
Exemple complet
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) _ Exercices d’application
98
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
Exemple complet
Private Sub Form1_Load(ByValsender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load TextBoxTaille.Text = "" Exercices d’application TextBoxTaille.Text = "" TextBoxPoids.Text = "" labelImc.Text = "" labelPi.Text = "" labelM.Text = "" labelS.Text = "" labelO.Text = "" End Sub
Private Sub Quitter_Click(ByValsender AsSystem.Object, ByVale AsSystem.EventArgs) Handles
Quitter.Click
Me.Close()
Exemple complet
Private SubButton1_Click_1(ByValsender AsSystem.Object, ByVale AsSystem.EventArgs) HandlesButton1.Click
DimsPoidsAs Single 'Variable Single contenant le poids
DimsTailleAs 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? Exercices d’application
100
'Les valeurs saisies sont-elles cohérentes?IfsTaille < 0.5 OrsTaille > 2.5 Then
MsgBox("Entrez une taille valide")
Exit Sub End If
IfsPoids < 20 OrsPoids > 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