:: El Monstruillo wARfeando ::

Access, ODBC y WinAPI

¿Cómo acceder a bases de datos de MS Access desde ODBC usando las WinAPI?

Para comenzar se debe enlazar la biblioteca odbc32.lib e incluir las cabeceras sql.h, sqlext.h y sqltypes.h.

Una vez echo esto ya se puede comenzar a llamar a las funciones de la ODBC API.

Para establecer una conexión ODBC con un archivo .mdb (MS Access) hay que seguir estos pasos:

1. Alojar memoria para un entorno ODBC e inicializarlo.
SQLHENV env; // El entorno
SQLRETURN ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
// ret = { SQL_SUCCESS | SQL_SUCCESS_WITH_INFO | SQL_INVALID_HANDLE | SQL_ERROR }
SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0);
2. Alojar memoria para un manejador de conexión y realizar la conexión.
SQLHDBC dbc; // El manejador de conexión
ret = SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
ret = SQLDriverConnect(dbc, (HWND)NULL, (SQLCHAR *) “DRIVER={Microsoft Access Driver (*.mdb)};, SQL_NTS, DBQ=D:\\basedatos.mdb”, outConnStr, outConStrLen, &retOutConnStrLen, SQL_DRIVER_COMPLETE);
// ret = { SQL_SUCCESS | SQL_SUCCESS_WITH_INFO | SQL_NO_DATA | SQL_INVALID_HANDLE | SQL_ERROR }

Una vez tenemos el manejador de conexión podemos comenzar a lanzar sentencias SQL sobre esta conexión, para ello seguiremos los siguientes pasos:

1. Alojar memoria para el manejador de sentencias:
SQLHSTMT stmt;
ret = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);
2. Crear y lanzar la sentencia SQL:
SQLCHAR sentencia[1024];
char tabla[] = “variable”; // o lo que sea, es solo una excusa para crear la sentencia :P
sprintf(sentencia, “SELECT * FROM %s”, tabla);
SQLExecDirect(stmt, sentencia, sizeof(sentencia));
3. Recuperar los datos si los hay:
SQLSMALLINT columns;
SQLNumResultCols(stmt, &columns);
// Ahora vamos fila por fila sacando las columnas
while (SQL_SUCCEEDED(SQLFetch(stmt))) {
SQLUSMALLINT i;
for (i=0; i <=columns; i++) {
char buf[1024];
SQLINTEGER len;
ret = SQLGetData(stmt, i, SQL_C_CHAR, buf, sizeof(buf), &len);
if (SQL_SUCCEEDED(ret)) {
if (len == SQL_NULL_DATA) strcpy(buf, “NULL”);
// AHORA EN “buf” tenemos un dato tratable como una cadena obtenido de la base de datos
}
}
}
El “ret” de SQLGetData puede ser (SQL_SUCCESS | SQL_SUCCESS_WITH_INFO | SQL_NO_DATA | SQL_STILL_EXECUTING | SQL_ INVALID_HANDLE | SQL_ERROR).
4. Se liberan los manejadores, en este mismo orden:
SQLFreeHandle(SQL_HANDLE_STMT, stmt);
SQLFreeHandle(SQL_HANDLE_DBC, dbc);
SQLFreeHandle(SQL_HANDLE_ENV, env);

Bien sencillo y funciona.
Ale.

This entry (Permalink) was posted on Wednesday, May 9th, 2007 at 15:13 and is filed under WinAPI. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response , or trackback from your own site.

Leave a Reply

You must be logged in to post a comment.