Vous êtes sur la page 1sur 24

MySQL et Visual Basic

TP FIP

Jérôme COLIN, 25 fév. 2003


Pour toute remarque, suggestion, critique : jerome.colin@ulp.u-strasbg.fr

1
TOC
„ Les Systèmes de Gestion de Base de Données
„ Qu’est-ce qu’une base de données ?
„ Rôle d’un SGBD
„ SQL : présentation du langage
„ Principe, types, fonctions, etc…
„ Les composants ActiveX Data Objet
„ Connexion, commande, tableau
„ Exemples de code

Quelques références

Pour MySQL :
http://www.mysql.com/Downloads/Manual/manual.pdf

Pour ADO :
Dans MSDN :
-SDK Platform
-Database and Messaging Services
-Microsoft ActiveX Data Objects
-Manuel de référence du programmeur ADO

2
Base de données
„ Un ensemble structuré de données
„ Différents modèles de structuration
„ Composants du modèle relationnel
„ Des tables dont la structure se calque sur les
relations entre les objets
„ Des attributs pour décrire chaque relation
„ Un ensemble d'opérateurs pour agir sur les
relations
„ Des règles d'intégrité pour garantir l’exactitude et
la cohérence des données

"Une base de données est définie comme étant un ensemble intégré de


données modélisant un univers. Cet univers est composé d’objets
interreliés. Les objets d'un même type constituent une entité et le lien
entre deux entités une association. Entités et associations sont
constituées chacunes d'un ensemble de caractéristiques."
"Le principe de base du modèle relationnel consiste à représenter aussi
bien les entités que les liens à l'aide de relations appelées aussi tables.
Une table est une structure tabulaire dont les colonnes, appelées aussi
attributs, correspondent aux caractéristiques de l'entité ou de l'association
à représenter et les lignes, appelées aussi [enregistrements],
correspondent aux objets."

ABDELLATIF A., LIMAME M., ZEROUAL A., 1996,


"Oracle 7 : langages, architecture, administration", Ed.
Eyrolles, Paris.

3
Terminologie
d e f
ID_mesure Date Heure T° Hr ID_site
c 1 10/04/01 12:00 12,4 67,1 1
2 10/04/01 10:00 15,2 56,7 2
3 10/04/01 14:00 g14,2 59,8 1
4 10/04/01 10:00 16,3 63,2 3
5 10/04/01 12:00 11,2 68,1 2
6 10/04/01 14:00 10,6 64,3 2

c Ligne unique ou enregistrement


d Colonne ou attribut - clé primaire
e Attribut sans clé
f Attribut - clé étrangère
g Champ

Terminologie des Bases de Données Relationnelles


Une base de données relationnelle peut contenir une ou plusieurs tables.
La table est la structure de stockage élémentaire d'un SGBDR. Elle
contient toutes les données nécessaires relatives à des éléments du
monde réel, comme par exemple les coordonnées d'un lieu, une
température en un point et à un instant donné.
La figure ci-dessus présente :
1. Une ligne unique, généralement appelée enregistrement ou tuple.
Chaque ligne est identifiée de manière unique par une clé primaire, ce qui
permet d'éviter les doublons. L'ordre des lignes est sans importance, il
peut être spécifié lors de l'extraction des données.
2. Cette colonne ou attribut contient un numéro de mesure unique. C'est la
clé primaire. Lorsqu'on intègre une clé primaire dans une table, elle doit
obligatoirement être renseignée. On peut aussi l'auto-incrémenter.
3. Cette colonne contient un attribut sans clé. Selon les données stockées
dans cette colonne, on définira le type d'attribut de champ (chaîne de
caractère, entier, date, etc…). Un attribut peut ne pas être renseigné. Il
prend alors la valeur NULL. Là aussi, l'ordre des colonnes n'a pas
d'importance.
4. Cette colonne contient une clé secondaire ou clé étrangère. Ici, la
donnée stockée dans les champs fait référence à la clé primaire de la
table T_site (voir page suivante).
5. Un champ se situe à l'intersection d'une ligne et d'une colonne. Il ne
peut contenir qu'une seule valeur.

4
Rôle d’un SGBD
Un SGBD doit assurer :
„ La définition des données

„ Création de bases, de tables, de relations…


„ La manipulation des données
„ Langage de requêtes SQL
„ La sécurité et l'intégrité des données
„ Privilèges, règles de connexion au niveau utilisateur…
„ La gestion des transactions et des accès concurrents
„ Service réseau, base de données d’administration…

Comment tester vos requêtes SQL ?


Vous pouvez passer par un programme client : WinClient.
Dans une fenêtre DOS, se mettre dans le répertoire du client :
C:\MySQL\bin\ par exemple.
Taper :
C:\MySQL\bin\mysql -h [host] -u [user] -p [dbname]
-h host : nom du serveur, ici seawif
-u user : votre login
-p le password vous sera demandé
dbname : facultatif, permet d'utiliser une base de donnée sans préciser
use [dbname] dans MySQL.
Remarque : à partir d'une machine cliente sur Osiris, il n'est normalement
pas nécessaire de préciser le domaine ".u-strasbg.fr", l'host seul permet
d'identifier le serveur et le client. Toutefois, en cas d'erreur, il vaut mieux
entrer le nom complet.
Vous pouvez alors visualiser de contenu du serveur à partir de la fonction
SHOW
Permet d'obtenir des informations sur :
les bases de données existantes
mysql>SHOW DATABASES [LIKE wild_char];
les tables d'une base de données
mysql>SHOW TABLES [FROM db_name] [LIKE wild_char];

5
Le langage SQL
„ Qu’est-ce que c’est ?
„ SQL : Structured Query Language
„ Langage de requête standard (ANSI92)
„ Types de variables
„ Numériques, dates et heures, chaînes…
„ Fonctions
„ Insert, select, delete, etc…

Conventions d'écriture
Dans la présentation du langage, on utilisera les conventions d'écriture
suivantes :
commande commande ou option dans le client
'fichier' nom de fichier
'%' séquences de caractères
shell> ligne de commande DOS
mysql> ligne de commande MySQL
SELECT fonction SQL
[LIKE] paramètre optionnel
[LIKE|UNLIKE] le '|' sépare les choix possibles
{col_name|wild} paramètre imposé

Remarques générales
Une commande SQL se termine toujours pas un ';' ou \g.
On peut écrire une commande sur plusieurs lignes en tapant un carriage
return.
Pour utiliser une base de données, utiliser :
mysql>USE dbname
On peut aussi appeler une table par dbname.tbname.

6
Types de variables
„ On distingue trois principaux types : M : nb. Caract.
„ Numérique D : nb. Décim.
„ INT(M,D), FLOAT(M,D), DOUBLE(M,D), etc…
„ Date et heure
„ DATETIME ‘YYYY-MM-DD HH:MM:SS’, entre autres
„ Chaîne de caractère
„ CHAR(M)
„ Le type est définit lors de la création de la table et
impose un format aux données de chaque champs
„ Le type influence :
„ le format de stockage (nombre de bytes alloués)
„ les opérations de traitement (opérations mathématiques,
tris, etc…)

Types numériques
Les entiers :
TINYINT (1 byte), SMALLINT (2 bytes), MEDIUMINT (3 bytes), INT (4
bytes), INTEGER (4 bytes), BIGINT (8 bytes)
Les décimaux :
FLOAT(X) (4 bytes if X <= 24 or 8 bytes if 25 <= X <= 53), FLOAT (4
bytes), DOUBLE (8 bytes), REAL (8 bytes)
Remarque : le type de variable est déterminant dans la rapidité
d’exécution des requêtes. Il n’est pas inutile d’y réfléchir avant de créer
une table pouvant contenir plusieurs centaines de milliers
d’enregistrement.
Types date et heure
DATE (3 bytes), DATETIME (8 bytes), TIMESTAMP (4 bytes), TIME (3
bytes), YEAR (1 byte)
Les plus utiles :
DATETIME : date et heure au format 'YYYY-MM-DD HH:MM:SS‘
TIMESTAMP : si la date d’écriture est une donnée, comme par exemple
dans le cas de transactions avec un client.
Types chaînes de caractères
CHAR(M) (M bytes), VARCHAR(M), TINYBLOB, TINYTEXT, BLOB,
TEXT (L+2 bytes), MEDIUMBLOB, MEDIUMTEXT (L+3 bytes),
LONGBLOB, LONGTEXT
Utiliser simplement CHAR(M) pour stocker une chaîne de caractères,
avec M caractères.
7
Create table
Permet la création d'une table :
mysql>CREATE [TEMPORARY] TABLE [IF NOT EXISTS]
tbl_name [(create_definition,...)]
[table_options] [select_statement]

Exemple :
mysql>CREATE TABLE tPizza (
Id INT NOT NULL AUTO_INCREMENT,
nom CHAR(30) NOT NULL,
prix Float(6,2) NOT NULL,
PRIMARY KEY (Id)
NULL ≠ 0
);

CREATE TABLE
L'option [TEMPORARY] créé une table dans le répertoire c:\tmp. Elle
n'est pas visible avec SHOW TABLES et est supprimée lors de la clôture de
la connexion. Une table temporaire peut être utile lorsqu'une requête
nécessite une étape intermédiaire.
L'option [IF NOT EXISTS] permet de ne pas générer d'erreur si le nom
existe déjà.
Les paramètres [(create_definitions),…] caractérisent chaque
champs. On précise :
col_name type [NOT NULL | NULL] [DEFAULT
default_value] [AUTO_INCREMENT] PRIMARY KEY
(index_col_name,...)
NULL : absence de donnée (différent de zéro)
DEFAULT : valeur à donner si le champ n'est pas renseigné
AUTO_INCREMENT : numérotation automatique des champs. Remarquer
qu'un entier ne peut être ré-attribué si un enregistrement est effacé. Ainsi,
l'entier incrémenté ne correspond pas nécessairement au numéro de
l'enregistrement. En revanche, il est unique.
PRIMARY KEY : combinaison de UNIQUE et NOT NULL. Généralement,
on l'obtient pas auto-incrémentation.
[table_options] et [select_statement] ne seront pas abordés
ici.

8
Insert
Permet d'entrer des données dans la table
Trois solutions :
mysql>INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name [(col_name,...)]VALUES
(expression,...),(...),...
mysql>INSERT [LOW_PRIORITY |DELAYED] [IGNORE]
[INTO] tbl_name [(col_name,...)] SELECT ...
mysql>INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name SET col_name=expression,
col_name=expression, ...
Exemple :
mysql>INSERT INTO tPizza VALUES
(1,’traditionnelle’,8.55),(2,’Reine’,10.20);

INSERT
On a trois possibilités :
VALUES : on entre une suite de valeurs pour chaque champs
SELECT : on entre des données issues d'une sélection dans une autre table
SET : on fixe les données comme étant le résultat d'une expression
Remarque que pour INSERT … VALUES et INSERT … SELECT, col_name est
facultatif. Par défaut, tous les attributs sont concernés, dans leur ordre
d'apparition dans la table. Ainsi, si une table contient quatre attributs et que vous
entrez un INSERT … VALUES ("A",1), il y aura une erreur car le nombre de
champs renseignés ne correspond pas au nombre de champs de la table.
Par ailleurs, dans le cas suivant :
mysql>INSERT INTO t_site (lat, long) VALUES
(998100.125,112458.531);
si les champs non renseignés ont été configurés comme NOT NULL, il y aura une
erreur.
Dans le cas d'une auto-incrémentation, la valeur du champ doit être NULL ou non
renseignée. Par exemple, si l'id_site est auto-incrémenté, on écrira :
mysql>INSERT INTO t_site (lat, long, nom) VALUES
(998100.125,110125.247,"Illkirch"),(998150.214,111245.268,"Nieder
bronn-les-bains");

9
Select
Permet d'extraire des données suivant un ou plusieurs
critères :
mysql>SELECT [(format)] [(source file)] FROM
table_references [(select_expression)];

Quelques exemples :
mysql>SELECT 1+1;
mysql>SELECT * FROM tPizza;
mysql>SELECT * FROM tPizza WHERE prix<15 AND
prix>10;

SELECT
[(format)] : [(col_name),…)] [STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT]
[SQL_BUFFER_RESULT] [HIGH_PRIORITY]
[DISTINCT|DISTINCTROW|ALL]
Dans le cas d'une sélection de tous les attributs de la table, on
peut remplacer [(col_name),…)] par '*'.
[(source_file)] : [INTO{OUTFILE|DUMPFILE} 'file_name'
export_options]
Permet d'importer des données à partir d'un fichier ASCII.
[(export_option)] définit le format des données dans le
fichier (séparateurs de champs, séparateurs d'enregistrements,
etc…)
[(select_expression)] : [WHERE where_definition]
[GROUP BY {unsigned_integer|col_name|formula}
[ASC|DESC], ...][ORDER BY
{unsigned_integer|col_name|formula} [ASC|DESC] ,...]
[LIMIT [offset,] rows] [PROCEDURE procedure_name]];
[GROUP BY] permet de faire des regroupement sur un critère ou
par ordre ASC ou DESC.
[ORDER BY] permet de classer les champs.
[LIMIT] permet de n'extraire que les N premiers
enregistrements sélectionnés.
10
Select (suite)
Quelques fonctions utiles avec SELECT :

COUNT(col_name) : compte le nombre d'enregistrements


mysql>SELECT COUNT(id) from tClient;

MIN(col_name) et MAX(col_name) : minimum et maximum


mysql>SELECT MAX(prix) FROM tPizza;

AVG(col_name) : calcul la moyenne des valeurs d'une colonne


mysql>SELECT AVG(total) from tCommandes;

SELECT (suite)
Les fonctions d’aggrégation ne peuvent être utilisées dans une requête
imbriquée.
Par exemple :
mysql>SELECT nom FROM t_Client WHERE id=MAX(id);
Pour obtenir ce type d’information, il faut donc
procéder en deux étapes. Dans ce cas précis, on peut
aussi utiliser la requête suivante :
mysql>SELECT nom FROM t_Client ORDER BY id DESC limit
1;

11
Join
S’utilise avec Select pour joindre deux tables suivant
une clé primaire.

Par exemple :
mysql>SELECT t1.M_ID, t2.nom from tCommande as
t1, tClient as t2 WHERE t1.C_ID=t2.C_ID;
Ici, on cherche à associer les identifiants de commande (M_ID)
avec les noms de clients (nom) en utilisant comme clé l’identifiant
de client (C_ID).
Ecrire tCommande as t1 revient à attribuer un alias à la table, ce
qui évite d’avoir à taper les noms complets.

JOIN
Dans le cas d’une jointure complète de deux tables, on peut écrire la
requête sous la forme :
mysql>SELECT * FROM t1 LEFT JOIN t2 ON t1.id=t2.id;
Ou
mysql>SELECT * FROM t1 LEFT JOIN t2 USING(id);
Par exemple, si vous voulez la liste de toutes les
transactions pour un client donné à partir de son nom
:
mysql>SELECT * FROM tCommande LEFT JOIN tClient ON
tCommande.C_ID=tClient.C_ID WHERE
tClient.nom=‘Durand’;

12
Update
Permet de modifier la valeur d'un champ :

mysql>UPDATE [LOW_PRIORITY] [IGNORE] tbl_name


SET col_name1=expr1, [col_name2=expr2, ...]
[WHERE where_definition]
[ORDER BY ...]
[LIMIT #]

Par exemple :
mysql>UPDATE tPizza SET prix=12.5 WHERE
nom=‘traditionnelle’;

UPDATE
[LOW_PRIORITY] signifie que cette opération est reportée jusqu'à ce
que plus personne n'utilise la table.
Remarquer qu'il est conseillé de verrouiller une table lorsque l'on fait des
modifications en utilisant la commande LOCK.
[IGNORE] permet de ne pas générer d'erreur liée à un conflit d'intégrité.
Les enregistrements posant problème ne sont pas mis à jour. C'est une
extension MySQL au SQL92.
L'utilisation de [LIMIT] permet de s'assurer qu'un nombre restreint
d'enregistrements sont modifiés.
Si la valeur mise à jour est la valeur du champ, aucune opération n'est
effectuée.

13
Delete
Permet d'effacer un enregistrement :

mysql>DELETE [LOW_PRIORITY] FROM tbl_name


[WHERE where_definition]
[LIMIT rows]

Exemple :
mysql>DELETE FROM tClient WHERE nom=‘Durand’;

DELETE
La fonction DELETE impose de faire une sélection. On ne peut pas faire
par exemple :
mysql>DELETE * FROM t_site;
Par contre, rien n'empêche de faire :
mysql>DELETE FROM t_site WHERE id_site<>0;
L'utilisation de LIMIT permet de partitionner la tâche dans le cas où elle
prendrait énormément de temps. On ne l'utilise généralement pas dans
notre cas.

14
Drop
Permet d'effacer une table :

mysql>DROP TABLE [IF EXISTS] tbl_name [,


tbl_name,...]

Exemple :
mysql>DROP TABLE tPizza;

Rappel : les commandes SQL sont toutes irréversibles

DROP
Les deux options [RESTRICT | CASCADE] ne sont pas fonctionnelles pour le
moment.
Cette fonction permet aussi d'effacer une base de données, mais
seulement venant de l'administrateur.

15
Alter
Permet de modifier la structure d'une table :
mysql>ALTER [IGNORE] TABLE tbl_name alter_spec [,
alter_spec ...]

Parmis les [alter_spec] les plus utiles :


ADD [COLUMN] create_definition [FIRST | AFTER
column_name ]
ADD PRIMARY KEY (index_col_name,...)
DROP [COLUMN] col_name
RENAME [TO] new_tbl_name

ALTER
Autres [alter_specification]:
ADD [COLUMN] (create_definition, create_definition,...)
or ADD INDEX [index_name] (index_col_name,...)
or ADD UNIQUE [index_name] (index_col_name,...)
or ADD FULLTEXT [index_name] (index_col_name,...)
or ADD [CONSTRAINT symbol] FOREIGN KEY index_name
(index_col_name,...)
or ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
or CHANGE [COLUMN] old_col_name create_definition
or MODIFY [COLUMN] create_definition
or DROP INDEX index_name
or ORDER BY col
or table_options
Compte tenu des potentialités de la fonction ALTER et donc des dégâts
qu'une mauvaise utilisation peut engendrer, elle fait l'objet d'un privilège
spécifique.

16
Liaisons VB/MySQL
Application Visual Basic 6.0
Objet Command DataGrid MS Chart

ActiveX Data Objet

Fournisseur OLE DB Object Linking and Embedding

MyODBC sur PC client Open DataBase Connectivity

Serveur MySQL

17
Source ODBC
„ Le driver MyODBC
est installé sur tous
les PC
„ Les champs
‘database’, ‘user’ et
‘password’ seront
renseignés par votre
application VB

18
Les objets ADO
„ Connection
„ Error
„ Property
„ Command
„ Parameter
„ Property
„ Recordset
„ Field
„ Property
„ property

Utilisez l’explorateur d’objet du menu ‘Affichage’ (ou F2) pour visualiser la


structure de ces objets.
Connection : représente une session d’un utilisateur sur une source de
données.
Error : objet de la collection Errors récupérant les messages d’erreur du
fournisseur de données.
Property : propriétés pouvant être mises à jour dynamiquement par le
fournisseur de données (surtout d’origine Microsoft).
Command : permet d’envoyer une instruction au fournisseur, ou encore
de définir le contenu d’un objet Recordset
Parameter : utilisé avec des fournisseurs utilisant des requêtes
paramétrées (pas MySQL)
Recordset : jeu d’enregistrement tabulaire, dont le contenu peut être soit
une table entière, soit de résultat d’une commande.
Field : représente une colonne de données. Les propriétés de l’objet
permettent entre autres de connaître le nom de l’attribut. Les méthodes
telles que MovePrevious et MoveNext permettent de se déplacer dans le
Recordset (dépend du type de curseur).

19
Connexion ADO
„ Pour se connecter :
Public Sub OpenConnectionMySQL()
On Error GoTo CheckError
strCnnMySQL = "DSN=" & DSN & ";uid=" & User & ";pwd="
& Password & ";database=" & Database
Set connectMySQL = New ADODB.Connection
connectMySQL.Open strCnnMySQL
CheckError:
Open "cnx.log" For Append As #256
Print #256, Date, Time, Err.Description
Close #256
End Sub

„ Pour se déconnecter :
Public Sub CloseConnectionMySQL()
connectMySQL.Close
End Sub

Principe :
-Définir la chaîne de connexion. Ici, on créé la chaîne en concaténant les
valeurs de variables renseignées par l’utilisateur dans une boit de dialogue
de connexion.
-Utiliser la méthode Open en fournissant la chaîne de connexion.

Les erreurs éventuelles sont récupérées automatiquement dans l’objet


Err. On peut alors récupérer des informations à partir des propriétés
Description et Number, entre autres.

Une connexion correspond à un accès à une source de données. On peut


très bien créer plusieurs connexions dans une même application. Par
exemple, si la base de données nécessite plusieurs niveaux de sécurité,
on peut créer un utilisateur disposant de privilèges limités et un autre
disposant de tous les droits sur la base, et y associer deux objets de
connexion différents.

20
Commande SQL
Public strSQL As String ‘Expression SQL
Dim cmdSQL As New ADODB.Command 'Commande de la
chaine

Public Sub ExeSQL()


Set cmdSQL.ActiveConnection = connectMySQL
cmdSQL.CommandType = adCmdText
cmdSQL.CommandText = strSQL
cmdSQL.Execute , , adCmdText
End Sub

Principe :
-Définir la connexion associée à l’objet de commande
-Définir le type de commande (propriété CommandType de l’objet
Command). Correspond à l’objet de la commande, comme par exemple
une expression SQL, un nom de table, etc…
-Définir la chaîne de la commande (propriété CommandText de l’objet
Command)
-Exécuter la commande (méthode Execute)

Dans ce cas de figure, la requête ne demande pas de retour de données.


Dans le cas contraire, on peut utiliser la méthode Execute sous la forme :
Set rstALL = MyCommand.Execute( , , adCmdText )

21
Recordset ADO
Public rstAll As New Recordset

Public Sub SelectAll()


'Récupère le contenu d’une table
On Error GoTo CheckError
connectMySQL.CursorLocation = adUseClient
strSQL = "select * from pizza;"
rstAll.Open strSQL, connectMySQL, adOpenStatic,
adLockOptimistic
frmWait.Hide
Exit Sub
CheckError:
MsgBox "Erreur n°" & Err.Number & " - " &
Err.Description, vbCritical, App.Title
End Sub

Méthode Open (ADO)

recordset.Open Source, ActiveConnection, CursorType,


LockType, Options

Paramètres :
Source : instruction SQL, nom de table…
ActiveConnection : connexion ADO préalablement déclarée
CursorType : ici adOpenStatic (ouvre un curseur de type statique). Suivant
la source de données, les autres possibilités peuvent ne pas fonctionner.
LockType : type de vérouillage pour des accès concurents à une même
source de données

22
Administration et accès
Seuls les utilisateurs déclarés ont accès au serveur.
On distingue :
„ l’administrateur :
„ a tous les droits
„ gère les comptes utilisateurs et les privilèges
„ les utilisateurs :
„ sont déclarés comme user@host pour accéder à au moins une
base de données
„ sont limités dans leurs actions en fonction des privilèges qui
leurs sont attribués

Administration et accès
Chaque utilisateur est identifié par :
• un nom (user)
• le nom de la machine cliente (host)
Chaque utilisateur a alors un certain nombre de privilèges, qui lui sont
attribués par l'administrateur. Les privilèges concernent différents niveaux
:
• le serveur tout entier
• une base de données
• une table d'une base de données
• une colonne d'une table d'une base de données
Un utilisateur peut donc avoir des privilèges limités selon la machine
cliente qu'il utilise. De même, chaque utilisateur n'a de droits que sur la
partie d'une bases de donnée qu'il le concerne directement.

23
Pour ce TP…
„ Le serveur : mirv.u-strasbg.fr
„ Le DNS : MySQL
„ La base de données :
„ Dupliquée pour 8 binômes
„ Un utilisateur par base
„ En cas de gaffe, me demander pour restaurer la
base
„ De la documentation se trouve à l’adresse
http://mirv.u-strasbg.fr

24

Vous aimerez peut-être aussi