Carlos Robles frikiblog

Usar bases de datos MySQL en visual C++

| 11 Comments

MySQL es el servidor de bases de datos open source más popular del mundo. Mayormente se usa desde PHP, siempre han ido de la mano y en realidad no es muy habitual utilizarlo en programas en otros lenguajes, pero tambien se usa, y a veces puede ser muy necesario. Por ejemplo si tenenmos una web con sus bases de datos, y necesitamos de algun programa que acceda a esos datos, por ejemplo en un cgi que tal vez llamemos desde un cron job o un webservice, por ejemplo . Otra cosa es que tengamos un programa que haga lo que sea, y vamos a crear un panel de control via web, y preferimos que las bases de datos esten en MySQL para hacer esta labor mas facil.

Hay mucha información en internet, pero normalmente es bastante complicado de seguir, sobre todo porque es documentacion demasiado genérica, y suele sobrar la mayoria de la informacion. Por ejemplo, por lo general no hace falta descargarse ningun archivo fuente, configurar el makefile, ni compilar nada.

Yo lo he hecho varias veces, y aunque dependiendo de la maquina siempre hay que pelearse un poco, por lo general basta con seguir estos pasos.

Descargar el servidor MySQL, si no lo tenemos ya.  Si vamos a instalar un XAMP, o cualquiera de este tipo, pues ya nos serviría, pero si no, lo mejor es ir directamente a la página oficial (http://dev.mysql.com/downloads/mysql/) y descargarse la version completa, no significa que con la version “Essentials” no vaya a funcionar, pero con la completa nos garantizamos que tenemos las dll y las lib que podamos necesitar en cualqier momento. Son alrededor de 100Mb.

Después, descargamos el conector, que es lo que no permitirá usar el servidor desde un programa en C++. vamos a http://dev.mysql.com/downloads/connector/cpp/1.1.html#downloads

Nos fijamos en la ruta en que se instalaron tanto el conector como en el servidor mismo. Lo primero es incluir en nuestro proyecto de visual studio todas las librerias que hacen falta, y añadir los include directories.

En las imagenes pongo las cosas que hay que añadir, cambia las rutas por las que correspondan en tu ordenador si no son las mismas.

Una vez todo configurado, en el código debemos  incluir
en el codigo necesitas incluir:


#include "mysql_connection.h"
#include "mysql_driver.h"
#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
#include <cppconn/prepared_statement.h>

Basicamente la interaccion con la base de datos se compone de estas cosas:

sql::Driver *driver;
sql::Connection *con;
sql::Statement *stmt;
sql::ResultSet *res;
sql::PreparedStatement *pstmt;

Lo mejor es ver algun ejempo. Basicamente hay que crear el driver, solo una vez, luego para cada coneexion, se intenta conectar en con = driver->connect(server,username,password);
La conexion puedes dejarla abierta o cerrarla y abrirla en cada query, eso al gusto, tal vez en otro momento explique mis decisiones sobre esto.
Para hacer los queries, me gusta utilizar prepared statements , porque aportan ventajas, y dan seguridad y comodidad respecto a distintas cosas, como el control de errores, el escapado de caracteres especiales y cosas de ese tipo, pero si no se quiere no es necesario usarlo. Es todo un mundo, pero basicamente lo que habria que hacer es un sql parametrizado, utilizando ‘?’ donde va a ir un dato, y luego enviar los parametros por orden
por ejemplo, hago esta consulta:

sql="INSERT IGNORE INTO dtv_sms (Estado,IdRemota, Remitente, FechaHoraRecepcion, Alias, NumeroCorto, Texto, TextoEmitido, MT) VALUES ";
sql=sql+"('"+status+"','"+id+"', '"+ remitente+"', '"+fecha+"', '"+alias+"', '"+numcorto+"', ? ,?,? );";

los int, como no dan fallo, los meto sin mas en el sql, pero los string, los dejo como variables,
y luego, si tenemos unos variables texto, textoEmitir,mt, que son strings, con los valores que sean, hariamos asi:

pstmt->setString(1,texto);//ojo que se empieza en 1!
pstmt->setString(2,textoEmitir);
pstmt->setString(3,mt);
res=pstmt->executeQuery();

Tambien hay que tener en cuenta que un prepared statement tiene dos formas de lanzarse, con pstmt->executeUpdate(), si es una modificacion de la base de datos (no devuelve nada) o con pstmt->executeQuery() si devuelve algo.

cuando el query devuelve algo, res, tendra el resultado. res es un iterador. tiene funciones como rowsCount(), afterLast(), beforeFirst(), previous(), next(), getField(), todas son autodescriptivas.
getString()  funciona de una forma muy sencilla, se le envia el nombre del campo, y devuelve el valor correspondiente de ese campo en la fila a la que apunta el iterador. res tiene otras funciones como getInt, y asi para varios tipos. yo no me complico, utilizo siempre getString, y ya lo convierto si hace falta.

Aquí adjunto un documento con ejemplos oficiales de codigo e instrucciones de instalacion, pero si has conseguido que funcione sin leerlo, mejor fijarse solo en los ejemplos, porque hay un monton de informacion extra que puede resultar muy contaminante.

Algún dia con calma pondre algún ejemplo mío.

res=pstmt->executeQuery();
Facebook Twitter Linkedin Plusone Digg Delicious Reddit Email

11 Comments

Leave a Reply

Required fields are marked *.