Este documento describe ODBC y cómo usar la API de ODBC en C. Explica qué es ODBC, cómo instalar y configurar ODBC en diferentes sistemas operativos, y cómo conectarse a bases de datos, ejecutar consultas, usar transacciones y más funciones utilizando la API de ODBC en C.
2. 1 Qu´ es ODBC?
e
Implementaciones
Drivers
2 Instalaci´n y configuraci´n
o o
Configuraci´n Windows
o
Configuraci´n Mac OS
o
Configuraci´n Linux
o
3 Uso de la API en C
Conexi´n
o
Consultas con bind
Consultas preparadas
Transacciones
Otras funciones
3. ODBC en C
Qu´ es ODBC?
e
Qu´ es ODBC?
e
ODBC = Open Database Connectivity
Es una interfaz de acceso a datos
DBMS Relacionales y no-relacionales
Basado en la especificaci´n ISO Call Level Interface (CLI) del SQL Access
o
Group.
CLI define como deben enviarse las consultas al DBMS y como devolver
los recordsets (db2cli, ODBC)
Historia
1992 - SQL Access Group comienza sus trabajos
1993 - 1.0 Microsoft lanza su implementaci´n
o
1995 - 3.0 Grandes cambios API
1997 - 3.5 Unicode
6. ODBC en C
Qu´ es ODBC?
e
Implementaciones
Linux
iODBC
librerias: libiodbc2 libiodbc2-dev
entorno GTK+
Compilar: gcc -l iodbc
UnixODBC
librerias: unixodbc unixodbc-dev
Compilar: gcc -l odbc
Entorno QT
iODBC no inclu´ soporte ODBC 3
a
ODBC 2.x y 3.x
Ejecuci´ compatibles / Compilaci´n incompatibles
ıon o
Interfaz de configuraci´n
o
7. ODBC en C
Qu´ es ODBC?
e
Drivers
Linux
MySQL ODBC driver (MyODBC)
Librer´ mysqlclient
ıa:
Protocolo: MySQL ClientServer Protocol
apt-get install libmyodbc
ODBC driver for PostgreSQL
odbc-postgresql
Oracle ODBC Driver
Libreria: Oracle Call Interface
Protocolo: SQL*Net
Librer´ nativas
ıas
8. ODBC en C
Instalaci´n y configuraci´n
o o
Configuraci´n Windows
o
Configuraci´n Windows
o
Inicio > Configuraci´n > Panel de control > Fuentes de datos ODBC 32 bits
o
9. ODBC en C
Instalaci´n y configuraci´n
o o
Configuraci´n Windows
o
Configuraci´n Windows
o
10. ODBC en C
Instalaci´n y configuraci´n
o o
Configuraci´n Mac OS
o
Configuraci´n Mac OS
o
Hard Disk > Applications > Utilities > ODBC Administrator
11. ODBC en C
Instalaci´n y configuraci´n
o o
Configuraci´n Linux
o
Configuraci´n Linux
o
Opciones de configuraci´n:
o
$ODBCINI - Variable de entorno
/.odbc.ini - Directorio personal
/etc/odbc.ini - A nivel de sistema
Herramientas de configuraci´n:
o
Herramienta gr´fica ODBCConfig
a
odbcinst
Ficheros de configuraci´n
o
12. ODBC en C
Instalaci´n y configuraci´n
o o
Configuraci´n Linux
o
Drivers
/etc/odbcinst.ini
[mysql_driver]
Description = Mysql Connector
Driver= /usr/lib/odbc/libmyodbc.so
UsageCount = 1
CPTimeout =
CPReuse =
[oracle_driver]
Description = Oracle express driver
Driver = /usr/lib/oracle/libsqora.so
13. ODBC en C
Instalaci´n y configuraci´n
o o
Configuraci´n Linux
o
Data Sources
/etc/odbc.ini
[mysql_dsn]
Driver = mysql_driver
Description = Mi base Mysql
SERVER = localhost
USER = user_database
Password = passwd_database
Database = database_name
OPTION = 3
[oracle_dsn]
Driver = oracle_driver
ServerPort = localhost:1521
TargetDSN = mydatabase
LoginUser = userID
LoginAuth = password
14. ODBC en C
Instalaci´n y configuraci´n
o o
Configuraci´n Linux
o
Pooling
/etc/odbcinst.ini
[ODBC]
Trace = Yes
Trace File = /tmp/sql.log
Pooling = Yes # Activar pooling
[mysql_driver_p]
Description = Mysql Connector
Driver= /usr/lib/odbc/libmyodbc.so
UsageCount = 1
CPReuse =
DontDLClose = 1
CPTimeout = 120 # Permanencia conexi´n
o
Pooling a nivel de driver
15. ODBC en C
Instalaci´n y configuraci´n
o o
Configuraci´n Linux
o
Trace
/etc/odbcinst.ini
[ODBC]
Trace = Yes
Trace File = /tmp/sql.log
Pooling = Yes # Activar pooling
[mysql_driver_p]
Description = Mysql Connector
Driver= /usr/lib/odbc/libmyodbc.so
UsageCount = 1
CPReuse =
DontDLClose = 1
CPTimeout = 120 # Permanencia conexi´n
o
MSQRY32 ba:c0 ENTER SQLPrepare
HSTMT 0x0082fc08
UCHAR * 0x00085bc8 [ 59] "SELECT TABLA1.COL1 FROM PRUEBA1.TABLA1 TABLA1"
SDWORD 59
16. ODBC en C
Instalaci´n y configuraci´n
o o
Configuraci´n Linux
o
Verificar
Verificar
$ odbcinst -q -s
[mysql_dsn]
$ odbcinst -q -d
[mysql_driver]
$ isql mysql_dsn
Connected!
SQL>
17. ODBC en C
Uso de la API en C
Conexi´n
o
Conexi´n
o
ejemplo conexion.c
#include <stdio.h>
#include <sql.h>
#include <sqlext.h>
int main() {
SQLHENV env; // entorno
SQLHDBC dbc; // conexion
//SQLHSTMT stmt; //statement
SQLRETURN ret; // respuesta
SQLAllocHandle(SQL HANDLE ENV, SQL NULL HANDLE, &env);
SQLSetEnvAttr(env, SQL ATTR ODBC VERSION, (void *) SQL_OV_ODBC3, 0);
SQLAllocHandle(SQL HANDLE DBC, env, &dbc);
// connecta al data source (DSN)
ret = SQLDriverConnect(dbc, NULL, "DSN=mysql dsn;", SQL NTS, NULL, 0,
NULL, SQL DRIVER COMPLETE);
if (SQL SUCCEEDED(ret)) {
printf("SI conectadon");
} else {
printf("NO conectadon");
}
return 1;
}
18. ODBC en C
Uso de la API en C
Conexi´n
o
Conexi´n
o
SQLAllocHandle
SQLRETURN SQLAllocHandle(
SQLSMALLINT HandleType,
SQLHANDLE InputHandle,
SQLHANDLE * OutputHandlePtr);
HandleType puede ser:
SQL HANDLE ENV - environment handle
SQL HANDLE DBC - connection handle
SQL HANDLE STMT - statement handle
SQL HANDLE DESC - descriptor handle
19. ODBC en C
Uso de la API en C
Conexi´n
o
Sintaxis
SQLRETURN SQLExecDirect(
SQLHSTMT StatementHandle,
SQLCHAR * StatementText,
SQLINTEGER TextLength);
Ejemplo SQLExecDirect
SQLExecDirect(stmt, "select * from mytable", SQL NTS);
SQLExecDirect = SQLPrepare + SQLExecute
20. ODBC en C
Uso de la API en C
Consultas con bind
Consultas con bind
ejemplo con bind.c
SQLINTEGER clave;
SQLCHAR nombre[256];
SQLINTEGER signal;
// Enlazamos variables a columnas
SQLBindCol(stmt, 1, SQL_C_SLONG, &clave, sizeof(clave), &signal)
SQLBindCol(stmt, 2, SQL_C_CHAR, &nombre, 256, &signal)
// Ejecutamos la sentencia
ret = SQLExecDirect(stmt, "SELECT clave, nombre FROM empleados;",
SQL_NTS);
while (SQL_SUCCEEDED(ret = SQLFetch(stmt))) { ... }
SQLCloseCursor(stmt);
Enlazamos elementos de cada columna con variables del mismo tipo
21. ODBC en C
Uso de la API en C
Consultas con bind
Tipos de datos
SQL type identifier C type native SQL specification
SQL CHAR SQL C CHAR[n+1] CHAR
SQL DECIMAL (?) DECIMAL(p,s)
SQL INTEGER SQL C SLONG / long INTEGER
SQL FLOAT float o double FLOAT(p)
SQL DOUBLE SQL C DOUBLE / double DOUBLE PRECISION
SQL VARCHAR SQL C VARCHAR VARCHAR
22. ODBC en C
Uso de la API en C
Consultas con bind
Consultas sin bind
ejemplo sin bind.c
long tipocol, numcols;
SQLExecDirect(stmt, "select * from mytable;", SQL NTS);
SQLNumResultCols(stmt, &numcols);
while (SQL_SUCCEEDED(ret = SQLFetch(stmt))) {
SQLColAttribute (stmt, numcols, SQL DESC CONCISE TYPE,
SQL NULL, 0, SQL NULL, &tipocol);
//Obtenemos variables sin binding
SQLGetData(stmt, 1, tipocol, &col, sizeof(col), &signal);
}
23. ODBC en C
Uso de la API en C
Consultas preparadas
Consultas preparadas
Preparadas: SQLPrepare y SQLExecute
UCHAR nombre
cbnombre = SQL_NTS; //null terminated string
SQLPrepare(stmt, " INSERT INTO empleados (id, nombre)
VALUES (NULL, ?)", SQL_NTS);
ret = SQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR,
SQL_CHAR, LENGTH, 0, lname, 0, &cbnombre);
strcpy(nombre, "Nombre1");
ret = SQLExecute(stmt);
strcpy(nombre, "Nombre2");
ret = SQLExecute(stmt);
Genera procedimientos almacenados temporales
24. ODBC en C
Uso de la API en C
Transacciones
Transacciones
The following shows how to turn auto-commit off:
SQLTransact
SQLSetConnectOption(hdbc, SQL AUTOCOMMIT, SQL AUTOCOMMIT OFF);
...
if (ilikeit())
SQLTransact(env, dbc, SQL_COMMIT);
else
SQLTransact(env, dbc, SQL ROLLBACK);
25. ODBC en C
Uso de la API en C
Otras funciones
M´s funciones
a
SQLGetDiagRec - Diagnostico (errores)
SQLRowCount - N´mero de columnas afectadas por SELECT, UPDATE o
u
DELETE
SQLTables - Tablas y vista
SQLColumns - Nombres de columnas
SQLProcedures - Procedimientos almacenados
Funciones entorno
SQLDrivers - Drivers disponibles
SQLDataSources - Data Sources disponibles
26. ODBC en C
Uso de la API en C
Otras funciones
Desconexi´n
o
ejemplo conexion.c
SQLFreeStmt(stmt, SQL_CLOSE); // statement handle
SQLDisconnect(dbc); // desconectar db
SQLFreeConnect(dbc); // connection handle
SQLFreeEnv(env); // environment handle