Vous êtes sur la page 1sur 11

Utilisation d'ADO avec Delphi dition personnelle

par Thierry AIM


Date de publication : 17 avril 2004 Dernire mise jour : 29 avril 2006

Utilisation d'ADO avec Delphi dition personnelle. La version tlchargeable de ce document est disponible ici : AdoDelphiPerso.zip version HTML

Utilisation d'ADO avec Delphi dition personnelle par Thierry AIM

Introduction...................................................................................................................................................................3 I - Connexion ODBC avec DSN..................................................................................................................................4 I.1 - Qu'est-ce que ODBC?....................................................................................................................................4 I.2 - Qu'est-ce qu'un DSN ?................................................................................................................................... 4 I.3 - Exemple de connexion ODBC une base donnes Access 2000................................................................ 4 I.3.A - Importer la bibliothque ADO................................................................................................................ 4 I.3.B - Cration de l'unit DSN......................................................................................................................... 5 I.3.C - Unit Principale du programme.............................................................................................................7 I.3.D - Procdure pour l'affichage des donnes dans la grille......................................................................... 7 I.3.E - Bouton Crer et Remplir la grille...........................................................................................................8 II - Connexion ADO directe......................................................................................................................................... 9 II.1 - Exemple de connexion ADO une base donnes Access 2000................................................................. 9 II.1.A - Importer la bibliothque ADO............................................................................................................... 9 II.1.B - Dclaration des variables publiques.....................................................................................................9 II.1.C - Bouton Crer et Remplir la grille..........................................................................................................9 III - Source des exemples......................................................................................................................................... 11

-2Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2004 Ccile MUNO (Khany). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://thierryaim.developpez.com/tutoriel/adodelphiperso/

Utilisation d'ADO avec Delphi dition personnelle par Thierry AIM

Introduction
L'dition personnelle de Delphi6 ou Delphi7 n'inclus pas les composants d'accs aux donnes de type ADO. (ActiveX Data Objects) Je ne m'tendrai pas sur ce qu'est ADO, il existe d'autres tutoriaux qui l'expliquent beaucoup mieux que je ne saurais le faire. En rsum, ce sont des composants universels d'accs aux donnes de tous types Ce cours ne constitue qu'un complment sur l'utilisation d'ADO, destin aux utilisateurs de Delphi dition personnelle. Nous supposerons donc que vous savez ce qu'est un recordset. (jeu d'enregistrements), une chane de connexion, un objet Command. Dans le cas contraire je vous invite auparavant lire les autres cours de ce site sur l'accs aux bases de donnes avec ADO : Dbuter avec ADO en Delphi(par Cyril Beaussier) Programmer ADO en Delphi(par J-M. Rabilloud)

Mme si l'on ne dispose pas de ces composants, il est tout fait possible de raliser une connexion une base de donnes moyennant quelques petites manipulations et un peu de code, et d'utiliser les Recordsets ADO Ce tutorial vous permettra de vous connecter une base de donnes Access (mais ceci reste un exemple) de 2 faons diffrentes avec Delphi Perso (test avec Delphi6 et Win2000) par la technologie ODBC et DSN par une connexion ADO directe

(Exemples tests avec Delphi6, Win2000 et ADO 2.5, 2.6 et 2.7) (tests avec Delphi7 et WinME par Nono40)

-3Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2004 Ccile MUNO (Khany). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://thierryaim.developpez.com/tutoriel/adodelphiperso/

Utilisation d'ADO avec Delphi dition personnelle par Thierry AIM

I - Connexion ODBC avec DSN I.1 - Qu'est-ce que ODBC?


ODBC : Open DataBase Connectivity. ODBC est un format dfini par Microsoft, fonctionnant quasi exclusivement sous Windows et permettant la communication entre des clients de bases de donnes et les diffrents fournisseurs de base de donnes. (sous rserve que ceux-ci possdent un driver ODBC, ce qui est le cas de tous les principaux SGBD : Access, Oracle, SQL Server, Dbase, ...) Gestionnaire ODBC pour Windows 95 et 98 : Panneau de configuration : Sources de donnes ODBC (32 bits) Gestionnaire ODBC pour Windows 2000, XP : Panneau de configuration, puis Outils d'administration : Sources de donnes (ODBC) Pour lier une base de donne a notre application, il va falloir dfinir une source de donnes, appele DSN.

I.2 - Qu'est-ce qu'un DSN ?


DSN : Data Source Name (Nom de la Source de Donnes) La source de donnes peut tre de diffrents types : une base de donnes, un fichier Excel, un fichier texte, ... Il nous faut donc dfinir une source de donnes pour permettre ODBC de connecter notre programme (client) la base de donnes (serveur ODBC) L'exemple ci-aprs permet la cration par le code du DSN ncessaire la connexion d'une base de donnes Access Toutefois vous pouvez crer vous mme le DSN dans le gestionnaire ODBC de Windows (voir prcdemment)

I.3 - Exemple de connexion ODBC une base donnes Access 2000 I.3.A - Importer la bibliothque ADO
NOTE : Cet exemple ne s'applique qu'aux systmes d'exploitation Microsoft Windows. Si ce n'est pas dj fait, vous devez en premier lieu installer les composants d'accs aux donnes de Microsoft (petite entorse Borland, ncessaire pour le fonctionnement du projet). Si vous ne l'avez pas, tlcharger MDAC_TYP.EXE [5Mo] sur le site de Microsoft. Ouvrez un nouveau projet Delphi Si l'installation de Mdac_typ s'est correctement effectue, dans l'onglet Projet et Importer une bibliothque de type , vous devez trouver :

-4Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2004 Ccile MUNO (Khany). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://thierryaim.developpez.com/tutoriel/adodelphiperso/

Utilisation d'ADO avec Delphi dition personnelle par Thierry AIM

Procder l'importation en cliquant Crer l'unit , l'unit ADODB_TBL est cre. Vous devez alors l'ajouter votre projet, onglet Projet et Ajouter au projet ... Dfinissez ensuite votre interface (un exemple est donn dans les codes sources disponibles la fin de cet article)

I.3.B - Cration de l'unit DSN


Dans l'application, crer une nouvelle unit nomme DSN. Nous allons dfinir dans cette unit, les fonctions que nous permettent de crer, modifier et effacer un DSN. Pour cela nous allons crer une classe (class) nomme FctDSN, incluant des fonctions de classes (class function). Dfinition d'une classe pour l'accs au DSN : Create pour la cration Remove pour la suppression Modify pour la modification des proprits
unit DSN; interface type FctDSN = class class function Create (DSNDriver : AnsiString; DSNName: AnsiString; DSNDescription: AnsiString; DSNbd: AnsiString) : Longint ; class function Remove (DSNDriver : AnsiString; DSNName : AnsiString) : Longint ; class function Modify (hwnd : Longint; DSNDriver : AnsiString; DSNName : AnsiString) : Longint; end; implementation

Dclaration de la fonction externe pour accder la configuration des DSN. Cette fonction appartient a la librairie ODBCCP32.dll du gestionnaire ODBC.
function SQLConfigDataSource (hwndParent : hwnd; fRequest : Longint; lpszDriver : AnsiString; lpszAttributes : AnsiString) : Longint; -5Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2004 Ccile MUNO (Khany). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://thierryaim.developpez.com/tutoriel/adodelphiperso/

Utilisation d'ADO avec Delphi dition personnelle par Thierry AIM stdcall; external 'ODBCCP32.DLL' name 'SQLConfigDataSource' ;

Dfinition de la fonction pour la cration d'un DSN. Cette fonction ncessite en paramtres : DSNDriver : Nom du driver utilis (dans notre cas, il s'agira du driver Access ) DSNName : Nom du DSN (c'est le nom que l'on va retrouver dans la liste du gestionnaire ODBC) DSNDescription : Une brve description de notre DSN (non necessaire au fonctionnement) DSNdb : Le nom (et ventuellement le chemin complet) de la base de donnes laquelle on veut se connecter
class function FctDSN.Create(DSNDriver : AnsiString; DSNName: AnsiString; DSNDescription: AnsiString; DSNbd: AnsiString) :Longint; var intRet : longint ; DSNAttributes: AnsiString ; begin DSNAttributes := 'DSN=' + DSNName + #0 ; DSNAttributes := DSNAttributes + 'DESCRIPTION=' + DSNDescription + #0 ; DSNAttributes := DSNAttributes + 'DBQ=' + DSNbd + #0 ; intRet :=SQLConfigDataSource(vbAPINull, ODBC_ADD_DSN, DSNDriver, DSNAttributes); If intRet = 0 Then Showmessage( 'Echec de cration du DSN') ; Result := intRet; end;

Dfinition de la fonction pour la suppression d'un DSN. Cette fonction ncessite en paramtres : DSNDriver : Nom du driver utilis (dans notre cas, il s'agira du driver Access ) DSNName : Nom du DSN (c'est le nom que l'on va retrouver dans la liste du gestionnaire ODBC)
class function FctDSN.Remove(DSNDriver : AnsiString; DSNName : AnsiString):Longint; var intRet : longint ; DSNAttributes: AnsiString ; begin DSNAttributes := 'DSN=' + DSNName + #0 ; intRet := SQLConfigDataSource(vbAPINull, ODBC_REMOVE_DSN, DSNDriver, DSNAttributes) ; If intRet = 0 Then Showmessage ('Echec de suppression du DSN') ; Result := intRet; End;

Dfinition de la fonction pour la modification d'un DSN. Cette fonction ncessite en paramtres : hwnd : Handle de la fentre appelante DSNDriver : Nom du driver utilis (dans notre cas, il s'agira du driver Access ) DSNName : Nom du DSN (c'est le nom que l'on va retrouver dans la liste du gestionnaire ODBC)
class function fctDSN.Modify(hwnd : Longint; DSNDriver : AnsiString; DSNName : AnsiString): Longint; var intRet : longint ; DSNAttributes: AnsiString ; begin DSNAttributes := 'DSN=' + DSNName + #0 ; intRet :=SQLConfigDataSource(hwnd, ODBC_CONFIG_DSN, DSNDriver, DSNAttributes) ; Result := intRet; end;

-6Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2004 Ccile MUNO (Khany). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://thierryaim.developpez.com/tutoriel/adodelphiperso/

Utilisation d'ADO avec Delphi dition personnelle par Thierry AIM end.

I.3.C - Unit Principale du programme


Dans notre exemple, nous dfinirons des constantes pour transmettre les paramtres ncessaires aux fonctions DSN. Ces valeurs peuvent bien sur tre paramtres.
DSNDriver = 'Microsoft Access Driver (*.mdb)';

Nom du driver ODBC utiliser. Si vous ne le connaissez pas, vrifiez dans le gestionnaire ODBC si votre driver existe et, si oui, trouvez son nom. Pour notre exmple nous utiliserons le driver pour Access.
DSNName = 'MS Access Delphi6';

Nom du DSN (qui appraitra dans le gestionnaire ODBC) C'est le nom sous lequel sera reconnu votre DSN pour votre application.
DSNDescription = 'Demo DSN ADO';

Description succincte du DSN. Une chane de caractre qui identifie plus prcisment votre DSN. Cette valeur n'est qu'une indication et n'a pas de fonctionnalit.
SQL = 'SELECT * FROM Outils';

Requte de slection. Une requte SQL classique, compatible avec le moteur Microsoft Jet.
DSNbd = 'bd1.mdb';

Nom de la base de donnes (si celle-ci ne se trouve pas dans le rpertoire de l'application, indiquer le chemin complet).

I.3.D - Procdure pour l'affichage des donnes dans la grille


Elle reoit en paramtre le recordset Elle extrait le nom des champs du recordset et les affiche sur la 1ere ligne de la grille Elle affiche toutes les valeurs dans la grille
procedure TForm1.Display(RecordSet: _RecordSet); var Y, i: Integer; begin Y := 1; StringGrid1.ColCount:=RecordSet.Fields.Count; RecordSet.MoveFirst; for i := 0 to RecordSet.Fields.Count-1 do StringGrid1.Cells[i, 0]:= RecordSet.Fields[i].Name ; repeat StringGrid1.RowCount := Y+1; for i := 0 to RecordSet.Fields.Count-1 do if not VarIsNull(RecordSet.Fields[i].Value) then StringGrid1.Cells[i, Y] := RecordSet.Fields[i].Value; RecordSet.Move(1, EmptyParam); Inc(Y); until RecordSet.EOF; end;

-7Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2004 Ccile MUNO (Khany). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://thierryaim.developpez.com/tutoriel/adodelphiperso/

Utilisation d'ADO avec Delphi dition personnelle par Thierry AIM

Cette procdure est incluse dans le code source, vous pouvez bien sur la personnaliser loisir, en fonction de vos inspirations

I.3.E - Bouton Crer et Remplir la grille


Nous allons dtailler cette fonction, qui est bien sr, la plus intressante :
procedure TForm1.CmdRemplirClick(Sender: TObject); ... Begin

Crer un DSN pour la liaison ODBC. Nous utilisons la fonction de cration que nous avons dfinie dans l'unit DSN
try FctDSN.Create (DSNDriver, DSNName, DSNDescription, DSNbd);

En cas d'erreur, vous tes renvoyer dans la partie except de l'instruction : vrifiez votre paramtrage dans les constantes ou dans vos variables. Crer un objet Recordset vide
OleCheck(CoCreateInstance(CLASS_RecordSet, nil, CLSCTX_ALL, IID__RecordSet, RS)); DSNstrg := 'DSN=' + DSNName;

Remplir le recordset (Fonction Open d'ADO).


RS.CursorLocation := adUseServer; {localisation curseur cot serveur} RS.Open(SQL, DSNstrg, adOpenForwardOnly, adLockReadOnly, adCmdUnspecified); Display(RS); {Afficher les valeurs dans la grille} except On E:Exception Do ShowMessage('Erreur d''ouverture de la base.'+ #13+E.Message); end; end;

Les autres fonctions sont construites sur le mme principe.

-8Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2004 Ccile MUNO (Khany). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://thierryaim.developpez.com/tutoriel/adodelphiperso/

Utilisation d'ADO avec Delphi dition personnelle par Thierry AIM

II - Connexion ADO directe


Dans le cas d'une base Access (utilisant les fonctionnalits Jet) , une connexion directe peut tre plus intressante, car moins lourde en programmation.

II.1 - Exemple de connexion ADO une base donnes Access 2000 II.1.A - Importer la bibliothque ADO
N'ayant pas besoin de crer un DSN, pour l'accs direct avec ADO, toute la diffrence rside dans la cration de la connexion la base de donnes. Je ne dtaillerai pas toutes les subtilits et paramtres des fonctionnalits d'ADO, un de mes confrre l'a dj fait, beaucoup mieux que je ne saurais le faire. Je vous engage une nouvelle fois lire les autres tutoriels de ce sites, afin de bien comprendre les mcanismes de ADO. Je rappelle que cet article ne constitue qu'un complment pour utiliser ADO avec une version personnelle de Delphi. Comme dans l'exemple prcdent, vous devez procder l'installation de Mdac_typ de Microsoft, importer la bibliothque ADO et l'ajouter votre projet. Vous n'avez pas besoin de l'unit DSN, dcrite dans le chapitre prcdent. Dans l'unit Main, la procdure d'affichage Display est rigoureusement identique celle dcrite ci-dessus.

II.1.B - Dclaration des variables publiques


var RS: _RecordSet; Cnx : _Connection; Cmd: _Command; {notre Recordset} {La connexion dfinir} {un objet command}

const SQL = 'SELECT * FROM Outils';

Requte de slection, une requte SQL classique, compatible avec le moteur Microsoft Jet.
DSNbd = 'bd1.mdb';

Nom de la base de donnes (si celle-ci ne se trouve pas dans le rpertoire de l'application, indiquer le chemin complet)

II.1.C - Bouton Crer et Remplir la grille


procedure TForm1.CmdRemplirClick(Sender: TObject); begin

Crer la connexion ADO pour Access 2000 (Microsoft jet 4.0)


try Cnx := CoConnection.Create;

Vous devez dfinir le provider (l'quivalent du driver utiliser dans la version avec DSN), ainsi que tous les paramtres ncessaires la connexion.
Cnx.Open( 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin; Data Source=bd1.mdb;', 'admin', '', -1 ); -9Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2004 Ccile MUNO (Khany). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://thierryaim.developpez.com/tutoriel/adodelphiperso/

Utilisation d'ADO avec Delphi dition personnelle par Thierry AIM

Crer un Recordset ADO.


RS := CoRecordSet.Create;

Crer un objet command ADO pour permettre de remplir le recordset


Cmd := CoCommand.Create; Cmd.CommandText := SQL; Cmd.Set_ActiveConnection(Cnx);

Remplir le recordset
RS.CursorLocation := adUseServer; {localisation curseur cot serveur} RS.Open(Cmd, Emptyparam, adOpenKeyset, adLockOptimistic, adCmdText ); Display(RS); {Afficher les valeurs dans la grille} except On E:Exception Do ShowMessage('Erreur d''ouverture de la base.'+ #13+E.Message); end; end;

Ne pas oublier de fermer les objets ouverts avant de quitter l'application pour viter tous dboires collatraux :
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin RS.Close; Cnx.Close; end;

Voil, nous sommes arriv au terme de notre projet. Tlchargez les sources compltes ( la fin de cet article) Configurez les constantes dans l'unit Main et votre grille pour l'affichage en fonction de votre BD et testez.

- 10 Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2004 Ccile MUNO (Khany). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://thierryaim.developpez.com/tutoriel/adodelphiperso/

Utilisation d'ADO avec Delphi dition personnelle par Thierry AIM

III - Source des exemples


Les codes sources des exemples sont disponibles sur les liens ci aprs. Ils comprennent toutes les units et une petite base de donnes avec une table correspondant l'exemple. D6_ODBC.ZIP exemple avec ODBC D6_ADO.ZIP exemple avec ADO

- 11 Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2004 Ccile MUNO (Khany). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://thierryaim.developpez.com/tutoriel/adodelphiperso/