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:
SQLHENV env; // El entornoSQLRETURN 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);
SQLHDBC dbc; // El manejador de conexiónret = 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:
SQLHSTMT stmt;ret = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);
SQLCHAR sentencia[1024];char tabla[] = “variable”; // o lo que sea, es solo una excusa para crear la sentencia
sprintf(sentencia, “SELECT * FROM %s”, tabla);SQLExecDirect(stmt, sentencia, sizeof(sentencia));
SQLSMALLINT columns;SQLNumResultCols(stmt, &columns);// Ahora vamos fila por fila sacando las columnaswhile (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).
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.