RE:Conexion con base de datos
Usualmente las bases de datos proporcionan APIs para ello. Ejemplos son las librerías en C de MySQL o los componentes COM que proporciona SQL Server 2000.
Una forma estandarizada para hacer esto es empleando ODBC. Es un API extensa, pero finalmente es uniforme para cualquier base de datos (hoy en día, toda base de datos usualmente provée de "drivers" ODBC). Consulta en www.msdn.microsoft.com el API, no es muy complicado. En particular, las siguientes funciones son las que más emplearías para consultas sencillas:
SQLAllocEnv, SQLAllocConnect, SQLDriverConnect - necesarias para establecer la conexión con la base de datos.
SQLAllocStmt, SQLExecDirect - ejecutan comandos SQL sobre la base de datos.
SQLFetch, SQLGetData - obtienen datos de la consulta SQL, como los resultados de stored procedures, o result sets.
SQLDisconnect, SQLFreeStmt, SQLFreeConnect, SQLFreeEnv - operaciones de limpieza de memoria y desconexión a la base de datos.
Los siguientes son ejemplos que saqué de MSDN. El primero muestra cómo conectarte, y el segundo, cómo obtener datos una vez ya conectado.
EJEMPLO 1:
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <sqltypes.h>
#include <odbcss.h>
SQLHENV henv = SQL_NULL_HENV;
SQLHDBC hdbc1 = SQL_NULL_HDBC;
SQLHSTMT hstmt1 = SQL_NULL_HSTMT;
int main() {
RETCODE retcode;
UCHAR szDSN[SQL_MAX_DSN_LENGTH+1] = "MyDSN",
szUID[MAXNAME] = "sa",
szAuthStr[MAXNAME] = "MyPassword";
// Allocate the ODBC Environment and save handle.
retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv);
// Notify ODBC that this is an ODBC 3.0 application.
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,
(SQLPOINTER)SQL_OV_ODBC3,
SQL_IS_INTEGER);
// Allocate an ODBC connection handle and connect.
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);
retcode = SQLConnect(hdbc1, szDSN, (SWORD)strlen(szDSN),
szUID, (SWORD)strlen(szUID),
szAuthStr, (SWORD)strlen(szAuthStr));
if ( (retcode != SQL_SUCCESS) &&
(retcode != SQL_SUCCESS_WITH_INFO) ) {
// Connect failed, call SQLGetDiagRec for errors.
}
else {
// Connects to SQL Server always return
// informational messages. These messages can be
// retrieved by calling SQLGetDiagRec.
}
// Allocate statement handles and do ODBC processing.
/* Clean up. */
SQLDisconnect(hdbc1);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return(0);
}
EJEMPLO 2:
#define NAME_LEN 50
#define PHONE_LEN 50
SQLCHAR szName[NAME_LEN], szPhone[PHONE_LEN];
SQLINTEGER sCustID, cbName, cbAge, cbBirthday;
SQLRETURN retcode;
SQLHSTMT hstmt;
retcode = SQLExecDirect(hstmt,
"SELECT CUSTID, NAME, PHONE FROM CUSTOMERS ORDER BY 2, 1, 3",
SQL_NTS);
if (retcode == SQL_SUCCESS) {
while (TRUE) {
retcode = SQLFetch(hstmt);
if (retcode == SQL_ERROR || retcode == SQL_SUCCESS_WITH_INFO) {
show_error();
}
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){
/* Get data for columns 1, 2, and 3 */
SQLGetData(hstmt, 1, SQL_C_ULONG, &sCustID, 0, &cbCustID);
SQLGetData(hstmt, 2, SQL_C_CHAR, szName, NAME_LEN, &cbName);
SQLGetData(hstmt, 3, SQL_C_CHAR, szPhone, PHONE_LEN,
&cbPhone);
/* Print the row of data */
fprintf(out, "%-5d %-*s %*s", sCustID, NAME_LEN-1, szName,
PHONE_LEN-1, szPhone);
} else {
break;
}
}
}
Saludos.