1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
| unit ConnexionBDD;
{
Nom de la classe : ConnexionBDD
Version: 1.0
Auteur: David Le Metayer
Copyright: FIBAT S.A.R.L
Classes utilisés:
Fonctions: Cette classe a pour but de réaliser une connexion à une base de données.
En utilisant les drivers ODBC, cette classe va pouvoir se connecter à plusieurs type de base de données comme Oracle, Access.
Les drivers ODBC peuvent être utilisés grâce à l'import (uses) du composant iodbc qui permet d'offrir les fonctionnalités nécessaires pour la connexion.
Lorsque l'on crée une connexion a une base, il suffira de passer en paramètres les informations suivantes:
- NomBase: il s'agit du nom de la base de données sur laquelle on doit réaliser les opérations.
}
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls, IniFiles,ComCtrls, ToolWin,ODBC;
type
TConnexionBDD = class
private
sNomBase : string;
bStatutConnexion : boolean;
public
// Variables pour la connexion ODBC
hEnv: SQLHENV;
hWnd: SQLHWND;
hdbc: SQLHDBC;
hstmt: SQLHSTMT;
RetCode: SQLRETURN;
pStream: Pointer;
// Variables pour l'exploitation des données
sChaine : String;
iChaine_Len : Integer;
iRet : Integer;
iRet2 : smallInt;
//Methodes publiques
Constructor Create(base:string);
procedure connexion();
procedure deconnexion();
function estConnecte():boolean;
function executeRequete(Requete:string):SQLHSTMT;
procedure insert(Requete:string);
end;
implementation
uses
Main;
// Constructeur
constructor TConnexionBDD.Create(base:string);
begin
sNomBase := base;
bStatutConnexion := false;
end;
//======================== LES METHODES =============================
// ================== LES PROCEDURES ========================
{
Cette méthode permet d'établir une connexion à une base de données.
Il faut permettre d'avoir des connexions directes avec les différents types de SGBD existants.
La connexion est établie en fonction de l'attribut sNomBase qui est l'adresse de la base ou l'on doit réaliser la connexion
}
procedure TConnexionBDD.connexion();
begin// Allocation d'un Handle d'environnement
RetCode := SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, Henv);
if sqlsucceeded(retcode) then
begin
// Fixe la version de l'ODBC
RetCode := SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, SQLPOINTER(SQL_OV_ODBC3), 0);
if sqlsucceeded(retcode) then
begin
// Allocation d'un Handle de connexion
RetCode := SQLAllocHandle(SQL_HANDLE_DBC, hEnv, hdbc);
if sqlsucceeded(retcode) then
begin
// Fixe le délai du login à 5 secondes
SQLSetConnectAttr(hDbc, SQL_LOGIN_TIMEOUT, SQLPOINTER(5), 0);
// Se connecte à la base de données en fonction du parametres sNomBase en utilisant le driver ACCESS
iChaine_Len := 256;
sChaine := StringOfChar(' ',iChaine_Len);
RetCode := SQLDriverConnect(hdbc,Application.Handle,
pchar('DRIVER=Microsoft Access Driver (*.mdb); DBQ=' + sNomBase),
SQL_NTS, PChar(sChaine), iChaine_Len, iret2, SQL_DRIVER_NOPROMPT);
if sqlsucceeded(retcode) then
begin
// Allocation d'un handle
RetCode := SQLAllocHandle(SQL_HANDLE_STMT, hdbc, hstmt);
bStatutConnexion := true;
end
else
raise ESQLerror.CreateDiag(SQL_HANDLE_DBC, hdbc, RetCode);
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
bStatutConnexion :=true;
end
else
raise ESQLerror.CreateDiag(SQL_HANDLE_DBC, hdbc, RetCode);
end
else
raise ESQLerror.CreateDiag(SQL_HANDLE_ENV, henv, RetCode);
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
end
else
raise ESQLerror.CreateDiag(SQL_HANDLE_ENV, henv, RetCode);
end;
//==============================================================================
{
Cette methode va permettre d'executer une requete SQL sur la base de données à
laquelle on est déjà connectée. Pour cela, on passe en paramètres de la fonction
une chaine de caractere contenant la requete( il doit contenir des commandes SQL)
Si la requete est executé correctement, la fonction retourne le resultat dans un SQLHSTMT.
Ce type de retour est un pointeur de l'adresse mémoire sur la première case ou son contenu
les resultats.
}
function TConnexionBDD.executeRequete(requete:string):SQLHSTMT;
begin
if estConnecte then
begin
if sqlsucceeded(retcode) then
begin
iChaine_Len := 50;
RetCode := SQLExecDirect(hstmt, Pchar(requete), SQL_NTS);
if sqlsucceeded(retcode) then
begin
Result := hstmt;
end;
end;
end;
end;
//==============================================================================
{
Cette methode doit permettre de déconnecter la connexion de la base de données.
Cette opération ne peut être réaliser que si la connexion est déjà établie.
Lors de la deconnexion on libere le lien sur la base ( suppression du verrou ) et
on change de statut à la connexion ( false ).
}
procedure TConnexionBDD.deconnexion();
begin
if bStatutConnexion then
begin
SQLDisconnect(hdbc);
bStatutConnexion := false;
end
else
raise ESQLerror.CreateDiag(SQL_HANDLE_DBC, hdbc, RetCode);
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
end;
//==============================================================================
procedure TConnexionBDD.insert(Requete:string);
begin
RetCode := SQLPrepare(hstmt, PChar(Requete), SQL_NTS);
if sqlsucceeded(retcode) then
begin
RetCode := SQLExecute(hstmt);
if not sqlsucceeded(retcode) then
raise ESQLerror.CreateDiag(SQL_HANDLE_STMT, hstmt, RetCode);
end
else
raise ESQLerror.CreateDiag(SQL_HANDLE_STMT, hstmt, RetCode);
end;
end;
//=============================================================================
{
Cette methode a pour but de connaitre l'état d'une connexion à la base de données
à n'importe quel moment.
si la connexion est établie, on retourne vrai,
sinon on retourne faux.
}
function TConnexionBDD.estConnecte : boolean;
begin
Result := bStatutConnexion;
end;
end. |
Partager