L'API Win32 ODBC permet d'accéder à la plupart des bases de données du
marché. Il suffit de posséder le driver ou pilote. Lorsque le poste possède
les logiciels comme MS-Office ou des environnements de développement comme
Visual Basic ou Visual C++, de nombreux drivers sont fournis:
- Ms-Access
- DBase
- Excel
- SQL Server ...
L'accès à une base se fait via un nom de source de données ou DSN (Data
Source Name). Le DSN regroupe l'ensemble des paramètres nécessaires à la
connexion. Chaque driver possède des paramètres qui lui sont propres:
- nom du serveur
- nom de l'utilisateur, mot de passe
- nom de la base de données ...
L'ensemble de ces informations sont accessibles au travers du programme
ODBCAD32.EXE:
Les sources de données sont propres à l'utilisateur connecté (User DSN) ou à la
machine (System DSN). Il est préférable de créer des sources de données
machine.
Une fois le DSN créé, on enchaîne les appels aux fonctions en passant les
bons HANDLE. La connexion est représentée par un HANDLE de type HDBC (Database
Handle) et les requêtes par des HSTMT (Statement Handle).
Chaque fonction retourne un code d'erreur de type RETCODE (Return Code):
- SQL_SUCCESS : OK
- SQL_SUCCESS_WITH_INFO : OK mais avec un message d'information
- SQL_ERROR et autres : problème
La séquence de connexion précise l'utilisation d'ODBC 3.0 et du nom de la
source de données: retcode = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv);
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);
// DSN = pubs_mdb
retcode = SQLConnect(hdbc1, (UCHAR *)"pubs_mdb", SQL_NTS, NULL, SQL_NTS, NULL, SQL_NTS);
Une fois que la connexion est établie, on peut exécuter une requête SQL en
associant les champs retournés à des chaînes de caractères:
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);
retcode = SQLExecDirect(hstmt1,(UCHAR *)"SELECT au_fname, au_lname FROM authors", SQL_NTS);
retcode = SQLBindCol(hstmt1, 1, SQL_C_CHAR,szFirstName, MAXNAME, &cbFirstName);
retcode = SQLBindCol(hstmt1, 2, SQL_C_CHAR,szLastName, MAXNAME, &cbLastName);
while ( (retcode = SQLFetch(hstmt1) ) != SQL_NO_DATA )
{
printf("Firt Name = %s, Last Name = %s\n", szFirstName, szLastName);
}
Il faut impérativement sortir en libérant les HANDLE:
SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);
SQLDisconnect(hdbc1);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
© 2001 Christophe Pichaud. All rights reserved.