You are on page 1of 31

UNIVERSITE Franois Rabelais TOURS c PolytechTours-Dpartement Informatique e 64, Avenue Jean Portalis 37200 TOURS

Projet de Base de Donnes : e Cration dune base de programmation de e DAO en VB, C++, C#, MySQL et ASP

Encadr par : e H. MARTEAU

Prsent par : e e Florian AGEN, Julien MICHOT Promotion 2004-2007

Projet de Base de donnes : e Cration dune base de programmation de DAO e en VB, C++, C#, MySQL et ASP
Florian AGEN - Julien MICHOT Juin 2005

Table des mati`res e


1 Gnralits sur la DAO e e e 1.1 La DAO suivant le langage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 La base de donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e 1.3 Les types de donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e 2 Programmation des fonctions de base 2.1 Ouverture et fermeture dune base de donnes e 2.1.1 Louverture de la base de donnes . . . e 2.1.2 La fermeture de la base de donnes . . e 2.2 Cration dune base de donnes . . . . . . . . e e 2.3 Cration dune table et de ses champs . . . . . e 2.3.1 La table . . . . . . . . . . . . . . . . . 2.3.2 Les champs . . . . . . . . . . . . . . . 2.4 Insertion dun enregistrement . . . . . . . . . 2.5 Consultation des enregistrements dune Table 2.6 Edition (mise a jour) dun enregistrement . . . ` 2.7 Suppression dun enregistrement . . . . . . . . 2.8 Remarques . . . . . . . . . . . . . . . . . . . . 3 Prsentation du programme e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 6 7 10 10 10 12 12 13 13 15 16 18 20 22 23 25

Introduction
Lutilisation dune base de donnes dans un programme informatique est aujourdhui une e chose assez courante. En eet, plusieurs services sont ainsi accessibles au travers de lenvironnement Access, comme par exemple lexecuteur de requtes SQL. e De plus, il existe de nos jours une multitude de langages de programmation, comme le C++, le Visual Basic ou encore le C#, et qui ne poss`dent gnralement pas les mmes cae e e e ractristiques. Aussi, la gestion dune base de donnes dire suivant le langage tudi. e e e e e La librairie de DAO de Microsoft (Microsoft DAO Library 3.6), que nous avons utilis au e cours de notre projet, ore une interface gnrique entre le langage de programmation choisi e e par le dveloppeur dapplication, et la base de donnes Access. Elle est donc le point commum e e entre ces dirents langages de programmation. e Notre but dans le cadre de ce projet de base de donnes sera dexpliciter comment dialoguer e avec une base de donnes suivant le langage informatique considr. Nous allons entreprendre e ee une comparaison des langages VB, C++, C#, MySQL et ASP au travers de direntes fonce tions de base de gestion dune base de donnes. Un exemple de programme sera prsent dans e e e une derni`re partie. e

Chapitre 1 Gnralits sur la DAO e e e


La librairie de dveloppement de DAO de Microsoft (Microsoft Library DAO 3.6) peut tre e e considre comme une interface de liaison entre le langage de programmation utilis par le ee e dveloppeur, et une base de donnes (gnralement une base de donnes Access). Elle contient e e e e e de nombreuses fonctions de gestion, ainsi que direntes constantes ncessaires ` la manipulae e a tion de la base de donnes. e Cette librairie est comme beaucoup de librairies, contenue dans un chier .DLL, ce qui permet de linclure dans un projet quelque soit le langage utilis (orient objet tout de mme). e e e Le principe des DLL est justement de pouvoir faire appel a des fonctions, indpendamment ` e du langage. On pourrait d`s lors penser que grer une base de donnes en VB, C++ ou C#, e e e reviendrait a faire de la recopie ! ` Or, si les fonctions sont a peu pr`s les mmes, les param`tres ` fournir sont totalement ` e e e a dpendants du langage. Nous devons donc adapter notre code pour chaque langage. e

1.1

La DAO suivant le langage

Lors de la ralisation de notre projet, nous avons commenc par crer un programme simple, e e e qui nous permettra de montrer les fonctions de base de gestion dune base de donnes, comme e nous le verrons dans la deuxi`me et troisi`me partie. e e * Visual Basic : Le premier langage utilis fut le Visual Basic, le langage le plus naturel pour grer une base e e de donnes Access. e Voici la marche a suivre pour inclure et ainsi pouvoir manipuler la DAO sous VB : ` Dans longlet Projet, cliquez sur Ajouter une rfrence..., ee Puis sous longlet COM, slectionnez la librairie Microsoft DAO 3.6 Object Library e Enn, cliquez sur OK Voici la bo de dialogue dajout dune rfrence (dans la version Microsoft Visual .NET) : te ee

* C# : Pour le langage C#, la procdure dinclusion de la DAO est identique a celle du Visual Basic. e ` Une fois que la rfrence Microsoft DAO est insre, vous avez la possibilit de consulter ee ee e les direntes fonctions disponibles de la DAO dans le langage considr, suivant la procdure e ee e suivante : Dans Lexplorateur de projet, cliquez sur References, Puis double-cliquez sur DAO (ou Interop.DAO). Vous obtiendrez ainsi toutes les fonctions (les prototypes), classes et autres constantes dnies dans la librairie. e

* C++ : Le langage C++ a pos beaucoup plus de probl`mes que pour les langages VB ou C#. En e e eet, en c++, nous avons la possibilit dinclure la librairie Microsoft DAO, mais nous ne poue vons pas accder aux dirents lments de celle-ci, directement ! (comme notamment lobjet e e ee DataBase) Aussi, Microsoft a dvelopp une interface appele AFXDAO, qui rednit toutes e e e e les fonctions de la librairie DAO, dans un chier nomm afxdao.h. e Donc pour faire de la gestion de base de donnes en c++, il est ncessaire dinclure en tte e e e de chier, le header afxdao.h (Ce chier est fourni par Microsoft avec Visual). * MySQL : Le langage MySQL est quand a lui plus particulier. ` Premi`rement, le MySQL ne peut pas vraiment tre considr comme un langage a part enti`re. e e ee ` e Il na ni variable, si instructions de conditions ou de bouble (si, tant que tec...). Il nest compos e que de fonctions prdnies, commenant par mysql . Le MySQL doit tre plutt considr e e c e o ee comme une interface entre le langage SQL et lenvironnement dans lequel il est utilis. Aujoure dhui, le MySQL est souvent utilis dans un environnement PHP, et quelque fois en c++. e Le programme de demonstration que nous avons entrepris, a t conu sous le langage PHP, ee c pour la partie traitement, et HTML pour la partie interface graphique.Par consquent, pour e lancer le programme, il faut un serveur PHP (comme Apache par exemple).

De plus, le MySQL ne g`re que des base de donnes hberges par un serveur, en SQL. Il e e e e ne peut en aucun cas ouvrir une connexion vers un chier .mdb ! * ASP : LASP permet quand a lui de grer une base de donnes Access. Il sut pour cela de dnir ` e e e plusieurs variables correctement, comme nous le verrons dans la deuxi`me partie. e Aucun chier nest ` inclure. a *C: Aucune librairie ne permet la gestion dune base de donnes en langage C. La DAO est e compose de classes, elles-mme composes de multiples mthodes, ce qui nest reconnu que e e e e par un langage orient objet, comme notamment le C++. e Le langage C, seul, ne peut donc pas manipuler une base de donnes Access. e

1.2

La base de donnes e

An dillustrer les fonctions de gestion dune base de donnes, nous avons choisis de travailler e sur une base de donnes contenant une seule table nomme Eleve, qui poss`de dirents champs. e e e e

Les champs sont dnis ainsi : e IdEleve : entier (cl, identiant de ll`ve) e ee NomE : cha de caract`res (nom de ll`ve) ne e ee PrnomE : cha de caract`res (prnom de ll`ve) e ne e e ee Age : entier (ge de ll`ve) a ee AnneeEtude : entier (anne dtude de ll`ve) e e ee Le programme, duliqu dans dirents langages, sera donc une gestion dl`ves, du dpartement e e ee e Informatique de Tours par exemple. Linsersion, la suppression, et la mise a jour des Ages et ` des Annes dtude seront implmentes. e e e e

1.3

Les types de donnes e

Lors de la ralisation du programme, nous avons choisis dutiliser des variables globales pour e dnir tous les lments ncessaires ` la gestion dune base de donnes. Cela nous permet ainsi, e ee e a e de pouvoir comparer directement et rapidement les dirences entre les dclarations. e e Nous mentionnons ci-apr`s, comment dnir les objets tels que RecordSet ou DataBase, e e suivant le langage utilis. e * Visual Basic : Variables globales du programme en VB : la base de donnes e Dim db As DAO.Database DBEngine permet douvrir et de crer une base de donnes e e Dim DBEngine As New DAO.DBEngine un recordset Dim rst As DAO.Recordset Table est utilise lors de la cration de la Table Eleve e e Dim Table As DAO.TableDef dclaration des champs de la table Eleve e Dim IdEleve As DAO.Field Dim NomE As DAO.Field Dim PrenomE As DAO.Field Dim Age As DAO.Field Dim AnneeEtude As DAO.Field En Visual Basic, dans la version .NET, nous sommes contraint de prciser lappartenance e des objets Database, RecordSet etc... Il faut donc dnir tous les lments de la base de donnes e ee e en mentionnant un DAO.LeTypeDeLObjet. La collection DBEngine est tr`s importante, car elle contient lensemble des classes utiles e (Connections, Database, ...). Si lon veut ouvrir ou crer une base de donnes, nous devons e e passer par le DBEngine. * C++ : Variables globales du programme en C++ : //la base de donnes e CDaoDatabase * db ; //un recordset CDaoRecordset *rst ; //Table est utilise lors de la cration de la Table Eleve e e CDaoTableDef * Table ; //dclaration des champs de la table Eleve e CDaoIndexInfo IdEleve ; CDaoIndexInfo NomE ; 7

CDaoIndexInfo PrenomE ; CDaoIndexInfo Age ; CDaoIndexInfo AnneeEtude ; Comme nous lavons vu prcdemment, le C++ utilise la biblioth`que afxdao pour grer e e e e la connexion a une base de donnes. Voil` pourquoi les direntes variables sont des classes, ` e a e dont le nom commence par CDao... (Class Data Access Object). Ces variables tant dclares en globales (sauf les CDaoIndexInfo), nous ne pouvons pas e e e dclarer directement des classes, mais seulement leur pointeur (ce qui est une caractristique e e du C++ : pas dallocation lors de la dclaration dans une classe). Par consquent, une fonction e e dallocation a t conue (appele Initialisation), et sera lance une seule fois au lancement ee c e e du programme. De plus, il faut remarquer quaucun DBEngine nest ncessaire, la connexion se fait direce tement au travers de la classe CDaoDatabase. * C# : Variables globales du programme en C# : //Declaration dun environnement Access Access.Application oAccess ; //la base de donnes e DAO.Database db ; //DBEngine permet douvrir et de crer une base de donnes e e DAO. DBEngine DbEngin ; //un recordset DAO.Recordset rst ; //Table est utilise lors de la cration de la Table Eleve e e DAO.TableDef Table ; //dclaration des champs de la table Eleve e DAO.Field IdEleve ; DAO.Field NomE ; DAO.Field PrenomE ; DAO.Field Age ; DAO.Field AnneeEtude ; Les dclarations des variables en C# rappelent fortement les dclarations en VB. Nous dee e vons ici aussi prciser le DAO., pour dnir lorigine des classes. e e La spcicit du C# rside dans le fait que nous devons aussi dnir un environnement e e e e Access. Dans tous les autres langages, cette dclaration nest pas ` raliser. Mais en C# elle e a e est obligatoire, car cest elle qui dnira le DBEngine (utilis pour ouvrir ou crer une base de e e e donnes). e Remarque : une fonction dinitialisation dAccess est aussi ncessaire (` raliser une seule fois) : e a e

oAccess=new Access.ApplicationClass() ; DbEngin=oAccess.DBEngine ; * MySQL : Variables globales du programme en MySQL : //la base de donnes e global $db ; //le nom du serveur (ex :localhost) global $Serveur ; //Nom de connexion global $LogDB ; //Mot de passe de connexion global $PassDB ; //Nom de la base de donnes e global $NomDB ; Pour le langages MySQL, les variables sont toutes de type identique. Il nest donc pas ncessaire de dnir un type spcialcomme pour les langages prcdents. e e e e e * ASP : Variables globales du programme en ASP : la connexion a une base de donnes ` e Dim Connexion un recordset Dim MonRs De mme quen MySQL, lASP noblige en rien a dnir le type des variables. e ` e Apr`s avoir dni les direntes variables globales utilises dans nos langages, nous pouvons e e e e tablir les direntes fonctions de base de la gestion dune base de donnes : e e e Louverture dune base de donnes e La fermeture dune base de donnes e La cration dune base de donnes e e Linsertion dun enregistrement La modication dun enregistrement La suppression dun enregistrement

Chapitre 2 Programmation des fonctions de base


Nous allons dnir dans cette deuxi`me partie, les principales fonctions de gestion dune e e base de donnes. Chaque fonction sera de plus, code dans 5 langages dirents (VB, C++, e e e C#, MySQL et ASP). La grande majorit des variables qui seront mentionnes tout au long de ce chapitre sont e e explicites dans la partie 1.3. Une variable appele chier contient ladresse et le nom de la e e base de donnes ` ouvrir (ou crer). chier est de type String quelque soit le langage utilis. e a e e Nous mentionnerons dans ce rapport, uniquement les param`tres obligatoires des fonctions e pour que la communication a une base de donnes stablisse correctement. Les nombreux pa` e e ram`tres optionnels oerts par la librairie ne seront donc pas explicits, ce sera aux dveloppeurs e e e dadapter les fonctions de base auc spcicits de leurs programmes. e e

2.1

Ouverture et fermeture dune base de donnes e

La gestion dune base de donnes passe bien entendu par louverture et la fermeture du e chier.

2.1.1

Louverture de la base de donnes e

* Visual Basic : db = DBEngine.OpenDatabase(chier) En Visual Basic, la connexion a une base de donnes seectue au travers de la collection DBEn` e gine. Seule, ladresse du chier est ncessaire. e * C++ : db Open (chier) ;

10

En C++, louverture de la base de donnes se fait directement en appelant une mthode de la e e classe CDaoDataBase, et en lui fournissant simplement ladresse du chier ` ouvrir. a * C# : //Ouverture de la base de donnes e db = DbEngin.OpenDatabase(chier,false,false,) ;

Louverture en C# est dj` plus complique, puisque 4 param`tres sont obligatoires : ea e e Le premier dnit ladresse du chier ` ouvrir. e a Le deuxi`me dnit les options douverture (ici aucune). e e Le troisi`me dcrit le caract`re ReadOnly (true = ouvert en lecture seule). e e e Enn le quatri`me param`tre reprsente la connexion. e e e (par exemple :ODBC ;DSN=Eleve ;DATABASE=Eleve ;UID=Loggin ;PWD=MotDePasse ;, ou simplement !) De nombreux param`tres peuvent ainsi tre spcis lors de louverture. Nous avons ralis notre e e e e e e programme avec les param`tres par dfaut, comme mentionn dans lexemple. Pour conna e e e tre chaque fonctionnalit, consultez la documentation MSDN, en cherchant...sous Visual Basic, car e il ny a aucune documentation de la DAO sous C# ! * MySQL : //Connexion au serveur MySQL $db=mysql connect($Serveur,$LogDB,$PassDB) ; //Ouverture de la base de donnes e mysql select db($NomDB,$db) ; Dans le MySQL, il est obligatoire dtablir une connexion a un serveur, dnit dans la e ` e variable $Serveur, pour accder ` une base de donnes (ex : localhost). Lorsquune aue a e thentication est demande, le Login et le mot de passe se passent aussi dans la fonction e mysql connect. Tous ces champs peuvent tre omis. e Il faut ensuite slectionner la base de donnes (contenue dans la variable $NomDB ici)que e e lon dsire consulter (` laide de la fonction mysql select db). e a * ASP : Denition de la source DSN BASE = QDB=&Server.Mappath(chier)& ; Driver={Microsoft Access Driver (*.mdb)} ;DriverId=25 Cration de la connexion e SET Connexion = Serveur.CreateObject(ADODB.Connection) Ouverture de la base de donnes e Connexion.open DSN BASE Ouverture dune session SET Session(NomSession) = Connexion En ASP, nous devons crer plusieurs objets an de pouvoir se connecter ` une base de e a donnes. e Il faut tout dabord crer une connexion ADODB. e 11

Puis, le type de connexion est a dnir par le dveloppeur. Ici, on se connecte ` une base ` e e a de donnes ` ladresse chier, en prcisant le type de driver : driver Access. e a e Enn, nous devons dclarer une session dans la connexion. e Tous ces v`nements taient compl`tement cachs dans les autres langages vus prcdemment. e e e e e e e

2.1.2

La fermeture de la base de donnes e

Voici comment fermer correctement une base de donnes. e * Visual Basic : db.Close() * C++ : db Close() ; * C# : db.Close() ; * MySQL : mysql close() ; * ASP : Connexion.Close SET Connexion = nothing Remarque : La fermerture est une action vraiment simple a raliser quelque soit le langage de program` e mation. Pour supprimer la communication AFXDAO, en C++, lors de la fermeture du programme, la fonction AfxDaoTerm() doit absolument tre appele ! Dans le cas chant, le programme e e e e entrainera une erreur. Pour les autres langages, aucune fonction nest indispensable loas de la fermeture du programme.

2.2

Cration dune base de donnes e e

La cration dune base de donnes fait aussi partie des fonctions principales pour la gestion e e dune base de donnes. e * Visual Basic : db = DBEngine.CreateDatabase(chier, DAO.LanguageConstants.dbLangGeneral) 12

En Visual Basic, lorsque lon crer une base de donnes, nous devons prciser notamment la e e e langue de la base de donnes. En gnral, il sagit de lalphabet courant (ASCII), on mentionne e e e donc dbLangGeneral. Mais il existe bien dautres alphabets (dbLangCyrillic, dbLangGreek etc...). * C++ : db Create(chier, dbLangGeneral) ; Pour le C++, il faut aussi dcrire le type de caract`res qui seront dans la base de donnes. e e e * C# : db = DbEngin.CreateDatabase(chier, DAO.LanguageConstants.dbLangGeneral,DAO.DatabaseTypeEnum.dbVersion40) ; Dans le cas du C#, il faut aussi dnir la version de la base de donnes ` gnrer. La e e a e e derni`re version des chiers .mdb dAccess tant la version 40. Nous avons de plus la possibilit e e e de crer une base de donnes crypte (en prcisant : DAO.DatabaseTypeEnum.dbEncrypt e e e e ou dbDecrypt). * MySQL : mysql create db ($NomDB) ; Le MySQL poss`de aussi une fonction de cration dune base de donnes (dont le nom est dans e e e la variable $NomDB. * ASP : Aucune fonction ne permet de crer directement une base de donnes Access en ASP. Peut e e tre quil existe des astuces, mais elles restent a dnir. e ` e

2.3

Cration dune table et de ses champs e

La cration dune table et de ses dirents champs sont des actions qui peuvent tre efe e e fectues sparment ou en une seule requte, suivant le langage. e e e e

2.3.1

La table

En Visual Basic et en C++, crer une table dans une base de donnes revient simplement e e a ` appeler une seule fonction, en prcisant le nom de la table. e * Visual Basic : 13

Table = db.CreateTableDef(Eleve) * C++ : Table Create(Eleve) ; * C# : Table = db.CreateTableDef(Eleve, DAO.TableDefAttributeEnum.dbAttachExclusive,Eleve,) ; Pour le C#, 3 param`tres supplmentaires sont ` dnir. Il y a tout dabord le nom de la e e a e table (Eleve), les attributs de celle-ci (dbAttachExclusive pour signier que lon utilise la Microsoft Jet database engine (par dfaut)), la source de la table (le nom de la table, encore) e et la connexion (si elle existe). * MySQL : //Cration de la requte e e $query=CREATE TABLE Eleve ( ; $query.=IdEleve INT NOT NULL , ; $query.=NomE CHAR( 255 ) NOT NULL , ; $query.=PrnomE VARCHAR( 255 ) NOT NULL , ; e $query.=Age INT NOT NULL , ; $query.=AnneeEtude INT NOT NULL , ; $query.=INDEX ( IdEleve ) ; $query.=) ; ; //On lance la requte e $resultat=mysql query($query,$db) ; * ASP : Cration dun RecordSet e SET MonRs = Serveur.CreateObject(ADODB.Recordset) ; Cration de la requte e e query=CREATE TABLE Eleve ( query&=IdEleve INT NOT NULL , query&=NomE CHAR( 255 ) NOT NULL , query&=PrnomE VARCHAR( 255 ) NOT NULL , e query&=Age INT NOT NULL , query&=AnneeEtude INT NOT NULL , query&=INDEX ( IdEleve ) query&=) ; Execution du RecordSet MonRs.Open query,Connexion Les langages MySQL et ASP sont plus particuliers. En eet, il nexiste pas de fonction en MySQL ou en ASP de cration de table. Nous devons d`s lors passer par le SQL pour gnrer e e e e des tables. Il faut pour les deux langages, crer la requte SQL, lancer celle-ci. Pour le MySQL, e e 14

il sagit ici dappeler simplement la fonction mysql query qui envoit au serveur la requte. e Pour lASP, il est ncessaire de passer par un RecordSet, que lon dclare (CreateObject), et e e que lon execute (MonRs.Open). Pour ces deux langages, les champs sont aussi dnis en SQL, en mme temps que la table. e e La cration de la table et de ses champs sont font par consquents en mme temps, il sagit e e e donc dune seule et mme action. e

2.3.2

Les champs

An dallger le rapport, un seul exemple de cration dun champs sera illustr pour chaque e e e langage. * Visual Basic : IdEleve = Table.CreateField(IdEleve, DAO.DataTypeEnum.dbInteger) Mise ` jour de la Table dans la base de donnes a e db.TableDefs.Append(Table) Pour le VB, ainsi que pour tous les autres langages, le type de chaque champs doit tre indiqu. e e Il existe de nombreux types dirents, avec entre autres : dbInteger,dbDecimal,dbText,dbTime e etc...). * C++ : Table CreateField(IdEleve,dbInteger,10,0) ; //Mise ` jour de la Table dans la base de donnes a e Table Append() ; En C++, la taille du champs (ici 10 (bits ou caract`res) ) ainsi que lattribut sont ` dnir. e a e * C# : IdEleve = Table.CreateField(IdEleve, DAO.DataTypeEnum.dbInteger,10) ; //Mise ` jour de la Table dans la base de donnes a e db.TableDefs.Append(Table) ; Le C# permet aussi de prciser la taille de lobjet. e * MySQL et ASP : Les dirents champs de la table Eleve sont gnrs lors de la cration de la table en ellee e ee e mme. Ce rfrer ` la cration dune table. e ee a e

15

2.4

Insertion dun enregistrement

La fonction la plus couramment manipuler dans une base de donnes est sans aucun doute e linsertion dun enregistrement. Par un souci de clart, nous avons dcid de ne prendre en compte que 2 champs dans la e e e table (IdEleve qui est un nombre, et NomE qui est une cha de caract`res). La procdure ` ne e e a suivre pour les autres champs (PrnomE, Age et AnneeEtude) est identiques. e Dans cette fonction, deux variables locales sont utilises : e nb, qui est un entier, et EntreeNom, un TextBox dont la valeur est accessible dpar lintermdiaire de son champ e Text. * Visual Basic : ouvre un recordset dans la table Eleve rst = db.OpenRecordset(Eleve) cration dun nouvel enregistrement e rst.AddNew() ajout des valeurs de champ rst(IdEleve).Value = nb rst(NomE).Value = EntreeNom.Text mise ` jour de la table a rst.Update() fermeture du recordset rst.Close() Le VB donne la possibilit aux dveloppeurs dinserer un enregistrement ` laide dun Recorde e a Set, ouvert sur la table Eleve. Il faut ensuite ajouter un nouvel enregistrement (AddNew), et dnir ses valeurs de champs. Enn, il est absolument indispensable denregsitrer dans la table e les modications (Update). * C++ : //ouvre un recordset dans la table Eleve rst Open( dbOpenDynaset, SELECT * FROM Eleve ) ; //cration dun nouvel enregistrement e rst AddNew() ; //ajout des valeurs de champ var.Clear() ; itoa(nb,str2,10) ; var.SetString(str2,VT BSTRT) ; rst SetFieldValue(IdEleve,var) ; var.Clear() ; 16

strcpy( str2,StringToChar(EntreeNom Text)) ; var.SetString(str2,VT BSTRT) ; rst SetFieldValue(NomE,var) ; //mise a jour de la table ` rst Update() ; //fermeture du recordset rst Close() ; Dans le cas du C++, plusieurs remarques sont a faire. ` Il faut premi`rement xer le type douverture du RecordSet : dbOpenDynaset (permet e de modier la base de donnes). e De plus, nous devons slectionner la table concerne (ici, en slectionnant tous les enree e e gistrements de la table Eleve). Nous avons essay de mettre seulement Eleve, mais le e recordSet ne fonctionnait plus. Ensuite, nous ralisons les mmes actions que pour le VB, nous dclarons un nouvel e e e enregistrement, que lon initialise et que lon ajoute rellement. e

Mais la principale dicult rsidait dans les conversions des variables. En eet, la fonction e e SetFieldValue prend comme param`tre un type peu commun en C++ : le COleVariant. Nous e avons donc dclarer une variable locale de type COleVariant : COleVariant var ;. Ce type e est en ralit le Variant du VB, il permet de transformer nimporte quel type en un autre type. e e Nous avons de plus utiliser une variable (str2) de type CHAR (tableau de chars) pour raliser e une premi`re conversion du type INT vers CHAR * (avec le str2), puis du type char * vers e BSTRT pour enn envoyer la variable var dans la fonction SetFieldValue ! La conversion peut sembler complique, elle est nanmoins obligatoire. e e * C# : //ouvre un recordset dans la table Eleve rst = db.OpenTable(Eleve, DAO.RecordsetOptionEnum.dbConsistent) ; //cration dun nouvel enregistrement e rst.AddNew() ; //ajout des valeurs de champ rst.set Collect(IdEleve,nb) ; rst.set Collect(NomE,EntreeNom.Text) ; //mise a jour de la table ` rst.Update(1,false) ; //fermeture du recordset rst.Close() ; Pour le C#, lide reste identique : ouverture dun RecordSet, cration dun enregistrement, e e aectation des valeurs et sauvegarde des modication. 17

Une petite dirence cependant, la fonction OpenTable doit avoir un param`tre Options, e e que nous avons dni comme dbConsistent, cest ` dire que les modications que nous allons e a entreprendre doivent tre prise en compte dans la base de donnes. e e Avec le C#, le probl`me des conversions est totalement eac, la fonction set Collect g`re e e e tr`s bien tous les types de donnes. e e * MySQL : //Cration de la requte e e $query=INSERT INTO Eleve ( IdEleve, NomE, PrnomE,Age e ,AnneeEtude) VALUES(etc...) ; //On lance la requte e $resultat=mysql query($query,$db) ; * ASP : Cration dun RecordSet e SET MonRs = Serveur.CreateObject(ADODB.Recordset) ; Initialisation du RecordSet MonRs.Open INSERT INTO Eleve ( IdEleve, NomE, PrnomE e ,Age,AnneeEtude) VALUES(etc...),Connexion Pour les langages MyQL et ASP, linsertion dun enregistrement seectue en SQL, dans une requte pour le MySQL, et dans un RecordSet pour lASP. e Aucune mise ` jour nest ncessaire, la fonction INSERT de SQL le fait automatiquement. a e

2.5

Consultation des enregistrements dune Table

Nous allons maintenant dnir la procdure ` suivre an daccder aux dirents enregise e a e e trements dune table donne. e Seulement deux champs seront voqus dans cette partie (IdEleve et NomE, un entier et e e une cha ne). Pour le reste des champs la marche a suivre reste identique. ` De plus, nous travaillerons sur un seul enregistrement. Une boucle de type while sera donc a ` ajouter pour consulter tous les enregistrements retourns, comme dans la fonction prcdente. e e e * Visual Basic : ouvre un recordset slectionnant les enregistrements que lon dsire consulter. e e rst = db.OpenRecordset(SELECT * FROM Eleve WHERE ...) Rcupration des valeurs du premier enregistrement e e num = rst(IdEleve).Value Nom = rst(NomE).Value En Visual Basic, comme dans les langages C++, C# et ASP, nous devons tout dabord appeler une requte SQL a laide dun RecordSet. Les dirents enregistrements sont alors retourns e ` e e dans celui-ci. En VB, les champs sont accessibles avec la syntaxe suivante : NotreRecordSet(NomDuChamp).Value . Les types des donnes sont tr`s bien grs puisque e e ee quaucune conversion supplmentaire nest ` ajouter. e a 18

* C++ : //ouvre un recordset dans la table Eleve rst Open( dbOpenDynaset, SELECT * FROM Eleve WHERE ... ) ; //Rcupration des valeurs du premier enregistrement e e var = rst GetFieldValue(IdEleve) ; var = rst GetFieldValue(NomE) ; A la dirence du VB, avec la C++, il faut lancer la fonction GetFieldValue(NomDuChamp) e du RecordSet pour obtenir la valeur du champ NomDuChamp. La variable var est du type COleVariant (que nous avons explicite antrieurement), donc e e pour avoir la valeur par exemple de lentier IdEleve, il faut ecrire : num = (int) var.intVal ; * C# : //ouvre un recordset rst = db.OpenRecordset(SELECT * FROM Eleve WHERE ..., DAO.RecordsetTypeEnum.dbOpenDynaset, DAO.RecordsetOptionEnum.dbConsistent, DAO.LockTypeEnum.dbOptimistic) ; //Rcupration des valeurs du premier enregistrement e e num = (int) rst.get Collect(IdEleve) ; nom = rst.get Collect(NomE) ; Le C# convertit quand ` lui aisment les dirents types de donnes. Nous utilisons en C# a e e e la mthode get Collect(NomDuChamp) qui retourne la valeur du champ NomDuChamp, de e lenregistrement en cours. * MySQL : //Cration de la requte e e $query=SELECT * FROM Eleve WHERE ... ; //On lance la requte e $resultat=mysql query($query,$db) ; //Acces aux valeurs : $Eleve=mysql fetch array($resultat) $num = Eleve[IdEleve] ; $nom = Eleve[NomE] ; Dans le cas du MySQL, les rsultats peuvent tre regroups dans un tableau. Cest ce que e e e fait la fonction mysql fetch array. Il ne reste plus qu` accder aux champs dont les valeurs a e sont dans le tableau ` lindice NomDuChamp (proprit des tableaux en PHP : on peut a ee aecter des noms aux cases dun tableau). * ASP : Cration dun RecordSet e 19

SET MonRs = Serveur.CreateObject(ADODB.Recordset) ; Execution du RecordSet MonRs.Open SELECT * FROM Eleve WHERE ... ,Connexion //Acces aux valeurs : num = MonRs(IdEleve) nom = MonRs(NomE) LASP se rapproche fortement du Visual Basic pour lacces aux donnes : il sut dappeler e le RecordSet en prcisant le nom du champs. e

2.6

Edition (mise ` jour) dun enregistrement a

Pour modier les valeurs de champs dun enregistrement, deux mthodes existent. Soit le e langage nous permet de changer les valeurs avec ses propres fonctions, comme le permmettent le VB, le C++ ou le C#. Soit nous devons construire et executer une requte SQL du type e UPDATE ..., comme le proposent le MySQL ainsi que lASP. * Visual Basic : ouvre un recordset rst = db.OpenRecordset(SELECT * FROM Eleve WHERE ...) ouvre ldition de lenregistrement e rst.Edit() met ` jour les valeurs Age et AnneeEtude a rst(Age).Value = EntreeAge.Value rst(AnneeEtude).Value = EntreeAnneeEtude.SelectedIndex + 1 active ces modications rst.Update() Avec le VB, le C++ et le C#, la procdure est identique, seule la syntaxe change. e Nous devons tout dabord crer et lancer un RecordSet slectionnant les enregistrements e e que lon dsire modier. Puis nous appelons la mthode rst.Edit qui prcise que lon va modier e e e les valeurs de champs. Enn, pour garder en mmoire les modications, le fonction rst.Update e doit tre lance. e e Comme nous lavons vu pour la fonction de consultation dune base de donnes, les valeurs e des champs dun enregistrement sont directement accssibles par le RecordSet. Il sut donc e daecter ces valeurs pour modier celles-ci. * C++ : //ouvre un recordset dans la table Eleve rst Open( dbOpenDynaset, SELECT * FROM Eleve WHERE ... ) ; //ouvre ldition de lenregistrement e 20

rst Edit() ; //met a jour les valeurs Age et AnneeEtude ` var.Clear() ; itoa((int)EntreeAge Value,str2,10) ; var.SetString(str2,VT BSTRT) ; rst SetFieldValue(Age,var) ; var.Clear() ; itoa(EntreeAnneeEtude SelectedIndex + 1,str2,10) ; var.SetString(str2,VT BSTRT) ; rst SetFieldValue(AnneeEtude,var) ; //active ces modications rst Update() ; Pour le C++, lopration de modication est plus aust`re. En eet, nous retrouvons le e e probl`me des conversions des variables (dtaille dans la partie Insertion dun enregistrement). e e e * C# : //ouvre un recordset rst = db.OpenRecordset(SELECT * FROM Eleve WHERE ..., DAO.RecordsetTypeEnum.dbOpenDynaset, DAO.RecordsetOptionEnum.dbConsistent, DAO.LockTypeEnum.dbOptimistic) ; //ouvre ldition de lenregistrement e rst.Edit() ; //met a jour les valeurs Age et AnneeEtude ` rst.set Collect(Age,EntreeAge.Value) ; rst.set Collect(AnneeEtude,EntreeAnneeEtude.SelectedIndex + 1) ; //active ces modications rst.Update(1,false) ; En C#, nous devons, comme pour tout appel de RecordSet, spcier les options de celui-ci e (dbOpenDynaset,dbConsistent...). De plus, la fonction de mise a jour Update en C# prend 2 param`tres : le premier dnit ` e e le type dupdate a eectuer (de type System.Int32 ), le deuxi`me param`tre tant un boolen ` e e e e (true = forcer la mise a jour, false = na pas forcer). ` * MySQL : //Cration de la requte e e $query=UPDATE Eleve SET Age= .$Age., AnneeEtude = .$AnneeEtude. WHERE ... ; //On lance la requte e $resultat=mysql query($query,$db) ; * ASP : 21

Cration dun RecordSet e SET MonRs = Serveur.CreateObject(ADODB.Recordset) ; Initialisation du RecordSet MonRs.Open UPDATE Eleve SET Age= &Age&, AnneeEtude = &AnneeEtude& WHERE ... ,Connexion En ce qui concerne les langages MySQL et ASP, la mise a jour des champs dun ou de ` plusieurs enregistrements se fait par la procdure UPDATE du langage SQL. Aucune fonction e dcriture dans une base de donnes nexiste rellement en MySQL et en ASP, on utilise donc e e e les fonction SQL.

2.7

Suppression dun enregistrement

Enn, la derni`re fonction de base pour la gestion dune base de donnes, voque dans ce e e e e rapport, est la suppression dun enregistrement. Dans tous les langages tudis, une requte SQL doit tre dnie an de slectionner les ene e e e e e registrements a supprimer. Pour allger les explications, nous allons simplement voir comment ` e supprimer un lment. Par extension, la suppression de tous les enregistrements retourns par ee e une requte se fera par une boucle du type while, qui dpent du langage considr (ce rfrer e e ee ee aux codes sources). * Visual Basic : ouvre un recordset rst = db.OpenRecordset(SELECT * FROM Eleve WHERE ...) Suppression de lenregistrement rst.Delete() Pour supprimer un enregistrement en VB, nous ouvrons tout dabord un RecordSet, qui slectionne par une requte SQL les enregistrements ` enlever, puis on appele la fonction Dee e a lete. Cette fonction supprime directement (pas besion dupdate) llment en cours, et ne ee supprime pas tous les lments. Il faudra donc faire une boucle (Do While Not rst.EOF), ee sans oublier de passer a lenregistrement suivant (rst.MoveNext()). ` * C++ : //ouvre un recordset dans la table Eleve rst Open( dbOpenDynaset, SELECT * FROM Eleve WHERE ... ) ; //Suppression de lenregistrement rst Delete() ; De mme quen VB, Delete eace simplement le premier enregistrement. Pour tous les eae cer, une boucle (while( !rst IsEOF())) doit tre implmente (avec rst MoveNext() ;). e e e

22

* C# : //ouvre un recordset rst = db.OpenRecordset(SELECT * FROM Eleve WHERE ..., DAO.RecordsetTypeEnum.dbOpenDynaset, DAO.RecordsetOptionEnum.dbConsistent, DAO.LockTypeEnum.dbOptimistic) ; //Suppression de lenregistrement rst.Delete() ; La suppression en C# est tout a fait similaire aux prcdentes. Il faut nanmois prciser ` e e e e obligatoirement le type et les options du RecordSet, ainsi quun param`tre nomm LockEdit. e e LockEdit permet de dnir comment les mises ` jour de la table sont eectues (lorsque plue a e sieurs utilisateurs se connectent : dbOptimistic=non bloqu ou dbPessimistic=bloqu ). e e * MySQL : //Cration de la requte e e $query=DELETE FROM Eleve WHERE ... ; //On lance la requte e $resultat=mysql query($query,$db) ; * ASP : Cration dun RecordSet e SET MonRs = Serveur.CreateObject(ADODB.Recordset) ; Initialisation du RecordSet MonRs.Open DELETE FROM Eleve WHERE ...,Connexion Les langages MySQL et ASP utilisent tous les deux la requte DELETE du langage SQL. e Ils ne poss`dent donc pas leur propre fonction de suppression. e

2.8

Remarques

Il y a quelques remarques a faire sur les langages voqus dans ce rapport. e e Premi`rement, il est a noter quil existe une librairie appele libmySQL, qui permet de faire e ` e du MySQL dans un environnement C++. Le MySQL nest donc pas cantonn ` lenvironneea ment PHP. Deuxi`mement, il est possible que lon dsire ajouter plusieurs options pour les RecordSet e e ou par les bases de donnes lors de leur cration. Cette fonctionnalit est possible ne insrant e e e e un | entre chaque option. Voici un exemple : dbAttachExclusive | dbAttachedODBC Enn, la traduction du programme de gestion dune base de donnes en C# fut une opration e e dicile. En eet, il nexiste aucun programme crit en C# manipulant les fonctions de DAO. e Il nexiste pas non plus de documentation de la DAO en C# ! 23

Aujourdhui, ce nest plus la librairie DAO qui domine le marcher, mais la librairie ADO.NET, commune ` dirents langages .NET. Il serait donc prfrable de passer ` cette librairie, qui a e ee a est beaucoup plus ouverte et simple a employer. `

24

Chapitre 3 Prsentation du programme e


An dillustrer les direntes fonctions de gestion dune base de donnes vues dans la partie e e prcdente, nous avons entrepris la ralisation dun mme programme sous dirents langages. e e e e e Voici un aperu du programme que nous avons ralis (en VB, C++, C# et MySQL) : c e e

Toutes les fonctions dcritent dans la partie 2 de ce rapport sont accessibles directement e dans linterface. Voici une description des fonctionnalits du programme. e * Ouvrir : permet de slectionner une base de donnes et lance la fonction douverture. e e * Crer : gn`re une base de donnes dont le nom est ` dnir, et lance la fonction douverture. e e e e a e

25

* Quitter : ferme la base de donnes, et quitte le programme. e * Lancer la requte : permet de lancer une requte SQL, dnie dans le champs texte nomm e e e e RequeteSQL. Le rsultat sachera dans la zone dachage. Attention a la syntaxe ! e ` * Ajouter : Ajoute un enregistrement dans la table Eleve, avec les param`tres dnis par e e lutilisateur (Nom, Prnom, Age et anne dtude). Lidentiant IdEleve sera gale au nombre e e e e denregistrements dj` prsents +1. ea e * Metter ` Jour : Permet de faire une mise a jour de 2 valeurs (Age et Anne dtude) dun a ` e e l`ve dni par lutilisateur (champs NomE et PrnomE). ee e e * Supprime : Eace un (ou des) l`ve(s) dni(s) par lutilisateur (champs NomE et PrnomE), ee e e de la table Eleve. * Lister les El`ves : Lit tous les enregistrements de la Table Eleve, et les ache dans la zone e de Texte. Cette opration est appele ` chaque modication de la table. e e a Remarques sur le programme : Peu de controls ont t implments. Lobjectif du projet tant la gestion de la base de ee e e e donnes dans dirents langages, la vrication de la syntaxe des champs rentrs par lutilisae e e e teur et la gestion de lintgrit de la base de donnes seront a inclure par les dveloppeurs. e e e ` e Ce programme a t conu pour tre le plus simple et le plus comprhensible que possible. ee c e e La cration de tables par exemple est ralise automatiquement lors de la cration de la base e e e e de donnes, mais elle pourrait tr`s bien tre aussi personnalise par lutilisateur, tant donne e e e e e e que le code est fournit. Cas du MySQL : Pour le langage MySQL, nous avons recr linterface du programme sous HTML (avec du ee Javscript). Pour manipuler le MySQL, nous avons utilis comme nous le mentionnions prcdemment, e e e le langage PHP, qui g`re tr`s bien le MySQL. Un serveur PHP est par consquent ncessaire, e e e e pour executer le script. Le PHP tant un langage dynamique, louverture et la fermeture de e la base de donnes sont appeles ` chaque action de lutilisateur, puisque nous ne pouvons pas e e a laisser une base de donnes ouverte. e Cas de lASP : Aucun exemple physique en ASP, na t conu. Nous navons pas eut le temps ncessaire ee c e pour entreprendre une programmation ASP. Cependant, ce document contient tous les lments ee essentiels a la cration dun projet de DAO sous ASP puisque toutes les fonctions mentionnes ` e e dans la partie 2 ont t traduites aussi en ASP. ee 26

Conclusion
Nous avons vu tout au long de ce rapport que la gestion dune base de donnes tait en e e grande partie dpendante du langage de programmation utilis. La librairie Microsoft DAO e e est reconnue par dirents langages, mais les prototypes des fonctions changent pour chaque e langage, et il est par consquent ncessaire de raliser une adaptation des param`tres. Cela e e e e inclus donc une perte de temps pour la recherche de param`tres ecaces. e Ce rapport apporte donc toutes les informations essentielles ` la gestion dune base de a donnes pour les langages de programmation VB, C++, C#, MySQL et ASP. e Les programmes fournis ralisent exactement les mmes fonctions, et pourront donc servir e e de mod`les pour de futurs projets de base de donnes. e e Il est a noter que les inconvnients de la librairie Microsoft DAO sont aujourdhui rsolus ` e e par la librairie ADO.NET qui apporte de nombreuses nouvelles fonctionnalites, et qui est e beaucoup plus approprie aux langages .NET. e

27

Rfrences ee
Cours de DAO - Visual Basic Access, annes 2004-2005, Hubert Marteau. e Cours dASP - VBScript, annes 2004-2005, Hubert Marteau. e Documentation MSDN, Microsoft - http ://msdn.microsoft.com/ Support Microsoft pour DAO - http ://support.microsoft.com/default.aspx ?scid=kb ;enus ;164481

28

Rsum e e
La gestion dune base de donnes est une opration totalement dpendante du langage de e e e programmation utilis. La librairie Microsoft DAO ralise linterface de dialogue entre le langage e e et la base de donnes. Elle poss`de de nombreuses fonctions de gestion, mais les param`tres ` e e e a grer di`rent suivant le langage. Ce rapport vitera donc ce travail fastidieux de recherche. e e e Les programmes fournis sont composs de fonctions gnriques, traduites dans 4 langages e e e de programmations.

Mots cls e
Base de donnes, Base de programmation, Visual Basic, C++, C#, MySQL, ASP, Microsoft e DAO Library.

Abstract
The database management is a totally dependent operation of the programming language used to achieve the software. The Microsoft DAO library makes the connection interface between the language and the database. The tool is full of management functions, in spite of the fact that parameters dier depending on the language. This report wants to spare users a tedious work of research. All the software we provide are made up of generic functions, translated in four programming languages.

Keywords
Database, Visual Basic, C++, C#, MySQL, ASP, Microsoft DAO Library.

You might also like