Cours de C++, en français, 2002 - Cours 3.2
-
Upload
laurent-buniet -
Category
Technology
-
view
112 -
download
0
Transcript of Cours de C++, en français, 2002 - Cours 3.2
Cours C++ (2002)
semaine 3
jour 2
Cours semaine 3 jour 2 Cours C++ 2
Plan du jour
Accès aux bases de données sur plate-
formes Microsoft
Cours semaine 3 jour 2 Cours C++ 3
Base de données relationnelles
Les base de données relationnelles utilisent
la théorie des ensembles
Un langage de requête standardisé existe :
SQL, Structured Query Language
La standardisation a ses limites
Il existe de nombreuses extensions par de
nombreux éditeurs de systèmes de gestion de
bases de données relationnelles, SGBD/R
Cours semaine 3 jour 2 Cours C++ 4
Base de données relationnelles (2)
Les bases de données permettent de stocker
facilement une grande quantité
d’informations
Elles sont incontournables dans le monde de
l’entreprise
Elles ne sont pas efficaces pour tous les
types d’information
Nous le verrons dans les prochains cours
Cours semaine 3 jour 2 Cours C++ 5
Accès aux bases de données
Dans le monde Microsoft
DAO : Data Access Object
ODBC : Open DataBase Connectivity
OLE DB : Object Linking and Embedding
ADO : ActiveX Data Object
Ces standards permettent de faire la
connection à la base, pas de retrouver des
informations : SQL reste nécessaire
Cours semaine 3 jour 2 Cours C++ 6
ODBC
ODBC est un médiateur
Il fournit une interface unique pour l’accès
aux bases de données SQL
Un driver ODBC implémente les
spécificités d’accès aux différentes bases : il
s’agit d’une extension au système
compatible avec la norme ODBC et une
base de données particulière
Cours semaine 3 jour 2 Cours C++ 7
ODBC (2)
Base de
données
relationnelle
driver
ODBC
système
d’exploitation
Windows
interface
ODBC
Gestion de l’accès et
de la récupération
des données
Cours semaine 3 jour 2 Cours C++ 8
ODBC (3)
Il y a plusieurs modèles ODBC
On parle de tiers
Cela correspond à un nombre différent de
couches dans lesquelles il faut passer avant
d’accèder véritablement à la base de données
Le schéma précédent correspond au modèle 1
tier (sur une machine)
Cours semaine 3 jour 2 Cours C++ 9
ProgrammeProgramme appelant une
fonction ODBC
ODBC ManagerL’ODBC Manager qui
définit ce qu’il faut faire
ODBC DriverL’ODBC Driver qui
effectue le traitement
Fichier
BDD
Le fichier de base de
données est ouvert par le
driver et les données sont
manipulées
ODBC (4) : 1 tier
Cours semaine 3 jour 2 Cours C++ 10
Programme appelant une
fonction ODBC
L’ODBC Manager qui
définit ce qu’il faut faire
L’ODBC Driver envoie le
traitement au serveur
Le serveur de base de
données traite la requête
Programme
ODBC Manager
ODBC Driver
Client
Fichier
BDD
Serveur
BDD
Serveur
ODBC (5) : 2 tiers
Cours semaine 3 jour 2 Cours C++ 11
ProgrammeProgramme appelant une
fonction ODBC
ODBC ManagerL’ODBC Manager qui définit ce
qu’il faut faire
ODBC DriverL’ODBC Driver envoie le
traitement au Gateway
Client
Serveur
Gateway
Fichier
BDDLe serveur de base de données
traite la requête
Serveur
BDD
ODBC Manager/DriverLe Gateway ODBC Manager /
Driver envoie la requête au serveur
ODBC (6) : 3 tiers
Cours semaine 3 jour 2 Cours C++ 12
ODBC (7)
DSN : Data Source Name
Un DSN est constitué :
Des informations sur la base de données,
De l’identifiant utilisateur (user ID),
Du mot de passe utilisateur,
Des informations de connections.
Cours semaine 3 jour 2 Cours C++ 13
ODBC (8)
Il existe deux types de DSN
Les DSN ou user DSN
Ils sont accessible par l’utilisateur qui les a créés
Les System DSN
Ils sont accessibles par n’importe quel utilisateur et
par le système lui-même
Cours semaine 3 jour 2 Cours C++ 14
ODBC (9)
Les informations ODBC sont accessibles
par Start > Settings > Control Panel > Data Sources
Cours semaine 3 jour 2 Cours C++ 15
ODBC Data Source
Une source de données est un système de stockage des données
Normalement un base de données, relationnelle ou pseudo relationnelle
Autre chose (…) : un fichier Excel peut être considéré comme une base de données relationnelle
Par extension d’Excel, un fichier texte peut également être accéder (Comma Separated Values, CSV)
Cours semaine 3 jour 2 Cours C++ 16
ODBC Data Source (2)
Cours semaine 3 jour 2 Cours C++ 17
ODBC Driver
Une Data Source possède obligatoirement
un pilote pour être exploitée
Le pilote respecte deux choses différentes :
Les spécifications ODBC pour pouvoir être
exploité sur la plate-forme Windows
Les procédures, méthodes et appels de fonction
propres à la base de données à laquelle il
permet d’accéder
Cours semaine 3 jour 2 Cours C++ 18
ODBC Driver (2)
Note : plusieurs versions d’une même base
peuvent posséder des drivers ODBC
différents
Lorsqu’une base de données évolue et qu’elle
fournit de nouvelles fonctionnalités, certaines
fonctionnalités anciennes peuvent être
modifiées ou supprimées
Les drivers doivent être mis à jour sur les
postes clients déportés lors d’une mise à jour
Cours semaine 3 jour 2 Cours C++ 19
ODBC Driver (3)
Cours semaine 3 jour 2 Cours C++ 20
ODBC Connection Pooling
Il se peut que plusieurs accès à une même base de données soient réalisés en même temps : besoin d’un connection pooling
Une certain nombre de connexions à la base de données sont effectués au démarrage du système
Les connexions, restées actives, sont distribuées aux différents demandeurs en fonction des besoins
Le connection pooling est un gain de temps
Cours semaine 3 jour 2 Cours C++ 21
ODBC Connection Pooling (2)
BDD
driver
pool
BDD
driver
poolapplication
BDD
driver
pool
Initialisation
du driver
Utilisation
du driver dans
une application
Fin de l’utilisation
du driver
Cours semaine 3 jour 2 Cours C++ 22
ODBC Connection Pooling (3)
Cours semaine 3 jour 2 Cours C++ 23
Visual C++ et ODBC
Deux classes permettent d’accèder à une base de données via ODBC
CDatabase
Informations sur la connexion à une base
Partageable dans toute l’application (singleton)
CRecordset
Informations sur un ensemble d’enregistrements
Gère les ajouts, les modifications et les suppressions
Les changements sont reflétés dans la base de données
Cours semaine 3 jour 2 Cours C++ 24
CDatabase
Pas de nécessité de créer d’instance de cette
classe
La création est effectuée à l’appel du
premier CRecordset
L’instance est réutilisée ensuite si nécessaire
de manière transparente
Cours semaine 3 jour 2 Cours C++ 25
Ouverture de CRecordset
Fonction membre Open
Premier argument : type de l’ensemble
d’enregistrements (Valeur par défaut :
AFX_DB_USE_DEFAULT_TYPE = snapshot)
Deuxième argument : instruction SQL à
exécuter pour créer le record set (si NULL,
instruction SQL du Wizard par défaut)
Troisième argument : manipulation du record
set, par défaut none
Cours semaine 3 jour 2 Cours C++ 26
CRecordset::Open, argument 1
CRecordset::dynaset : les enregistrements peuvent
être mis à jour pendant l’utilisation par appel de la
fonction Fetch
CRecordset::snapshot : les enregistrements seront
mis à jour à la fermeture du record set
CRecordset::dynamic : similaire à dynaset mais
n’est pas disponible dans tous les drivers
CRecordset::forwardOnly : lecture du premier au
dernier enregistrement uniquement
Cours semaine 3 jour 2 Cours C++ 27
CRecordset::Open, argument 3
Quelques-unes des options :
CRecordset::none : valeur par défaut,
aucune option n’affecte l’utilisation
CRecordset::appendOnly : lecture possible,
modification/suppression d’enregistrements
existants impossible, ajout de nouveaux
enregistrements en fin de fichier possible
CRecordset::readOnly : lecture seule
Cours semaine 3 jour 2 Cours C++ 28
CRecordset, navigation
Plusieurs fonctions de navigation sont
disponibles :
MoveFirst : déplacement sur le premier record
MoveLast : déplacement sur le dernier record
MoveNext : déplacement sur le record suivant
MovePrev : déplacement sur le record précédent
SetAbsolutePosition : déplacement sur le record
dont la position est donnée
Cours semaine 3 jour 2 Cours C++ 29
CRecordset, navigation (2)
Autre fonction : Move
Premier argument : nombre de records
parcourus pendant le déplacement, positif
(déplacement vers la fin du record set) ou
négatif (déplacement vers le début)
Deuxième argument : option de déplacement
SQL_FETCH_RELATIVE : tient compte du
premier argument
SQL_FETCH_NEXT : équivalent à MoveNext
Cours semaine 3 jour 2 Cours C++ 30
CRecordset, navigation (3)
Autre fonction : Move (suite)
Deuxième argument : option de déplacement
SQL_FETCH_PRIOR : équivalent à MovePrev
SQL_FETCH_FIRST : équivalent à MoveFirst
SQL_FETCH_LAST : équivalent à MoveLast
SQL_FETCH_ABSOLUTE : équivalent à
SetAbsolutePosition
Cours semaine 3 jour 2 Cours C++ 31
CRecordset, navigation (4)
Aides à la navigation
Fonction IsBOF : retourne le booléen TRUE si
le pointeur courant est sur le premier record
Fonction IsEOF : retourne TRUE si le pointeur
est en fin de record set
Fonction GetRecordCount : donne le nombre
total d’enregistrement dans le record set
Cours semaine 3 jour 2 Cours C++ 32
Opérations sur les records
Dans une base de données, quatre types d’opérations peuvent être effectuées : principe du CRUD
Create, création d’un enregistrement
Read, lecture
Update, mise à jour
Delete, destruction
Nous venons de voir les manières de faire la navigation, c’est à dire le Read
Cours semaine 3 jour 2 Cours C++ 33
Opérations sur les records (2)
Création de records
Fonction AddNew : création d’un nouveau
record ; pas d’argument mais doit être suivi de
l’affectation des valeurs du nouveau record et
de Update
Mise à jour d’un record
Fonction Edit : permet de modifier les champs
du record courant ; doit être suivi de la fonction
Update
Cours semaine 3 jour 2 Cours C++ 34
Opérations sur les records (3)
Destruction d’un record
Fonction Delete : supprime l’enregistrement
courant ; pas besoin d’appeler Update
(implicite) mais besoin de se déplacer sur un
autre enregistrement (appel de MovePrev ou
MoveNext par exemple)
Remarque : pas d’affectation nouvelle ou de
modification et donc pas besoin d’Update
Cours semaine 3 jour 2 Cours C++ 35
Opérations sur les records (4)
Fonctions auxiliaires
Update : enregistrement des modifications
courantes dans la base de données
Requery : réexécution de la requête SQL
originale pour remettre à jour le record set
courant
À utiliser par exemple après AddNew
À utiliser « régulièrement » si plusieurs utilisateurs
travaillent sur la même base de données
Cours semaine 3 jour 2 Cours C++ 36
Exemple avec ODBC
Création d’une base de données Access
avec le Wizard, sélection du modèle « base
de contacts » : base « ptcontact »
Obtention d’une base de données possèdant
des tables, des rapports et … des écrans de
saisie (forms)
Mise en place de la base de données parmi
les sources ODBC du système
Cours semaine 3 jour 2 Cours C++ 37
Exemple avec ODBC (2)
Cours semaine 3 jour 2 Cours C++ 38
Exemple avec ODBC (3)
Cours semaine 3 jour 2 Cours C++ 39
Exemple avec ODBC (4)
Refaire la même grille de saisie en C++
Cependant :
Pas de « calls » ni de « dial »
Cours semaine 3 jour 2 Cours C++ 40
Exemple avec ODBC (5)
Dans VCPP, créer une application
MFC(exe)
PTContact
Cours semaine 3 jour 2 Cours C++ 41
Exemple avec ODBC (6)
Cours semaine 3 jour 2 Cours C++ 42
Exemple avec ODBC (7)
*
Cours semaine 3 jour 2 Cours C++ 43
Exemple avec ODBC (8)
Cours semaine 3 jour 2 Cours C++ 44
Exemple avec ODBC (9)
Cours semaine 3 jour 2 Cours C++ 45
Exemple avec ODBC (10)
Cours semaine 3 jour 2 Cours C++ 46
Exemple avec ODBC (11)
Cours semaine 3 jour 2 Cours C++ 47
Exemple avec ODBC (12)
Cours semaine 3 jour 2 Cours C++ 48
Exemple avec ODBC (13)
Cours semaine 3 jour 2 Cours C++ 49
Exemple avec ODBC (14)
Cours semaine 3 jour 2 Cours C++ 50
Exemple avec ODBC (15)
Cours semaine 3 jour 2 Cours C++ 51
Exemple avec ODBC (16)
Cours semaine 3 jour 2 Cours C++ 52
Exemple avec ODBC (17)
Cours semaine 3 jour 2 Cours C++ 53
IDC_ECTRY
IDC_ESTAT
IDC_ECITY
IDC_EZIP
IDC_EADDR
IDC_EDEAR
IDC_EFIRM
IDC_ELNAME
IDC_EFNAME
IDC_ECNAME
IDC_ECTYPE
IDC_EENAME
IDC_EREFER
IDC_EID
IDC_ETITL
IDC_EWPHONE
IDC_EWEXT
IDC_EMPHONE
IDC_EFAX
IDC_ENOTES
Cours semaine 3 jour 2 Cours C++ 54
Cours semaine 3 jour 2 Cours C++ 55
Cours semaine 3 jour 2 Cours C++ 56
Cours semaine 3 jour 2 Cours C++ 57
Cours semaine 3 jour 2 Cours C++ 58
Exemple avec ODBC (23)
Cours semaine 3 jour 2 Cours C++ 59
Exemple avec ODBC (24)
Cours semaine 3 jour 2 Cours C++ 60
Exemple avec ODBC (25)
IDC_EFNAME = m_pSet->m_FirstName
IDC_ELNAME = m_pSet->m_LastName
IDC_EFIRM = m_pSet->m_CompanyName
IDC_EDEAR = m_pSet->m_Dear
IDC_EADDR = m_pSet->m_Address
IDC_EZIP = m_pSet->m_PostalCode
IDC_ECITY = m_pSet->m_City
IDC_ESTAT = m_pSet->m_StateOrProvince
Cours semaine 3 jour 2 Cours C++ 61
Exemple avec ODBC (26)
IDC_ECTRY = m_pSet->m_Country
IDC_ECNAME = RIEN
IDC_ECTYPE = m_pSet->m_ContactTypeID
IDC_EENAME = m_pSet->m_EmailName
IDC_EREFER = m_pSet->m_ReferredBy
IDC_ENOTES = m_pSet->m_Notes
IDC_EID = m_pSet->m_ContactID
IDC_ETITL = m_pSet->m_Title
Cours semaine 3 jour 2 Cours C++ 62
Exemple avec ODBC (27)
IDC_EWPHONE = m_pSet->m_WorkPhone
IDC_EWEXT = m_pSet->m_WorkExtension
IDC_EMPHONE = m_pSet->m_MobilePhone
IDC_EFAX = m_pSet->m_FaxNumber
Cours semaine 3 jour 2 Cours C++ 63
Cours semaine 3 jour 2 Cours C++ 64
Exemple avec ODBC (29)
M_LastMeetingDate est absent de notre
liste… Le code généré automatiquement ne
doit jamais être modifié mais
Le type CTime ne peut pas être pris en compte
CTime ne supporte pas les dates antérieures au
31 décembre 1969
Il faudrait le modifier en type COleDateTime
Cours semaine 3 jour 2 Cours C++ 65
Exemple avec ODBC (30)
Compilation et exécution de ptcontact.exe
L’application fonctionne mais rien n’est affiché
Normal : la base a été créée mais aucun
enregistrement n’a été ajouté !
Retournez sous Access et ajouter des
enregistrements
Réexécutez : les informations apparaissent
Cours semaine 3 jour 2 Cours C++ 66
Exemple avec ODBC (31)
Nous disposons d’une application accèdant
à une base de données qui est fonctionnelle
Nous pouvons parcourir les enregistrements
existants et faire des update
Nous ne pouvons pas encore ajouter de
nouveaux enregistrements
Nous ne pouvons pas encore supprimer des
enregistrements existants
Cours semaine 3 jour 2 Cours C++ 67
Exemple avec ODBC (32)
Pour l’ajout d’enregistrement :
Besoin d’une fonction qui retrouve le nombre
max de records existants (dans la classe de
gestion du Set)
Besoin d’une fonction qui fait la mise à jour
après saisie dans le formulaire (dans la classe
de gestion de la View)
Cours semaine 3 jour 2 Cours C++ 68
Cours semaine 3 jour 2 Cours C++ 69
m_ContactID;
Cours semaine 3 jour 2 Cours C++ 70
Cours semaine 3 jour 2 Cours C++ 71
Cours semaine 3 jour 2 Cours C++ 72
Exemple avec ODBC (37)
Cours semaine 3 jour 2 Cours C++ 73
Cours semaine 3 jour 2 Cours C++ 74
Exemple avec ODBC (39)
Suppression de l’enregistrement
Cours semaine 3 jour 2 Cours C++ 75
Cours semaine 3 jour 2 Cours C++ 76
Cours semaine 3 jour 2 Cours C++ 77
Cours semaine 3 jour 2 Cours C++ 78
Exemple avec ODBC (43)
Raccourci dans la barre d’outils
Simplifie l’interaction avec l’utilisateur qui n’a
plus besoin de parcourir les menus
Utilise les mêmes événements que ceux utiliser
dans les menus : inutile de réassocier les
fonctions…
Cours semaine 3 jour 2 Cours C++ 79
Cours semaine 3 jour 2 Cours C++ 80
Cours semaine 3 jour 2 Cours C++ 81
Cours semaine 3 jour 2 Cours C++ 82
Problèmes, problèmes
L’exemple précédent fonctionne sur un
même poste
Théoriquement : une base de données et un
utilisateur = pas de problème
Que se passerait-il si la base était accédée
par plusieurs utilisateurs ?
La base deviendrait instable à un moment ou un
autre : aucune notion de transaction n’est
intégrée
Cours semaine 3 jour 2 Cours C++ 83
Problèmes, problèmes (2)
Généralisation du problème précédent =
problème encore plus grave
Nous n’accèdons qu’à une base de données.
Une entreprise en possède généralement
plusieurs, chacune représentant un ensemble
cohérent
Travailler avec plusieurs bases nécessite de
travailler avec des transactions supportant le
« two phase commit », 2PC : pas disponible ici
Cours semaine 3 jour 2 Cours C++ 84
Two phase commit
BDD 1
BDD n
BDD 2
transaction
distribuée
commit
global
commit
local
commit
local
commit
local
OK
OK
OK
Cours semaine 3 jour 2 Cours C++ 85
Autre méthode d’accès
Nous venons de réaliser un programme avec
MFC avec un accès ODBC
Peu de travail à faire
Génération automatique de la majorité du code
À modifier soi-même le moins possible car c’est une
prise de risque
Modification parfois nécessaire comme pour le type
CTime
Utilisation rapide de la plateforme
Cours semaine 3 jour 2 Cours C++ 86
ADO
Comme déjà brièvement mentionné, il est
possible d’utiliser ActiveX pour accéder aux
bases de données : ADO, ActiveX Data
Object
ADO est une technologie assez récente qui
est désormais mise en avant avec ADO.NET
dans la nouvelle plate-forme .Net
Cours semaine 3 jour 2 Cours C++ 87
ADO (2)
OLE DB est un ensemble complexe
permettant d’accèder à un ensemble varié
de répertoires de données
Il ne s’agit plus uniquement de bases de
données relationnelles
Il est aussi possible d’accéder à des bases de
données hiérarchiques ou plates
Du fait de l’étendue des types de sources de
données, OLE DB est très complexe !
Cours semaine 3 jour 2 Cours C++ 88
ADO (3)
ADO est une couche logicielle qui vient se greffer
au dessus d’OLE DB pour simplifier le
développement
ADO contient un nombre minimum d’objets
Connection
Error
Command
Parameter
Recordset
Field
Cours semaine 3 jour 2 Cours C++ 89
ADO (4)
ADO fournit également des objets de collection permettant de traiter des ensemble d’Error, de Parameter et de Field
Connection permet d’établir et de maintenir des connexions à une base de données. Connection permet également de réaliser des contrôles de haut niveau sur les connexions, dont les transactions (BeginTrans, CommitTrans, RollbackTrans)
Cours semaine 3 jour 2 Cours C++ 90
ADO (5)
Error permet de retrouver les informations sur les erreurs, qu’il est possible d’examiner
Command permet d’exécuter une commande sur une source de données (typiquement du SQL pour les bases de données relationnellles) ; le résultat est le plus souvent du type RecordSet
Parameter permet de passer des paramètres associés à une Command
Cours semaine 3 jour 2 Cours C++ 91
ADO (6)
RecordSet contient un ensemble
d’enregistrement en provenance de la base
de données. Il est possible de naviguer dans
le RecordSet et d’accèder aux champs des
enregistrement avec Field
Field représente une seule colonne dans un
enregistrement du RecordSet
Type par défaut : Variant
Cours semaine 3 jour 2 Cours C++ 92
ADO (7)
Exemple d’application utilisant ADO
QueryTool
Téléchargeable sur www.mindcracker.com
Disponible sous format exécutable
Source C++ disponible sous la forme d’un projet
Visual C++ 6.0 SP3
Décompressez le Zip, compilez et faites tournez
en accèdant à la base PTContact
Cours semaine 3 jour 2 Cours C++ 93
ADO (8)
Cours semaine 3 jour 2 Cours C++ 94
ADO (9)
Cours semaine 3 jour 2 Cours C++ 95
ADO (10)
Cours semaine 3 jour 2 Cours C++ 96
ADO (11)
Dans le QueryTool, où se trouve le code
ActiveX ?
ADOConnectionEvents.h
msflexgrid.h
Helpers.cpp
ADO est finalement bien caché
Pour le voir de manière plus explicite, nous
allons créer une autre application
Cours semaine 3 jour 2 Cours C++ 97
ADO (12)
Créer une application MFC AppWizard
(EXE) en prenant tous les paramètres par
défaut sauf
SDI plutôt que MDI (écran 1)
CFormView plutôt que CView (écran 6)
Remarques :
Par défaut, il n’y a pas de database support…
Par défaut, l’application supporte ActiveX
Cours semaine 3 jour 2 Cours C++ 98
Cours semaine 3 jour 2 Cours C++ 99
ADO (14)
Cours semaine 3 jour 2 Cours C++ 100
ADO (15)
Cours semaine 3 jour 2 Cours C++ 101
Cours semaine 3 jour 2 Cours C++ 102
Questions / Remarques