Accès à une base de données MS-Access via ODBC


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.