Publi

Accediendo a bases de datos MySQL desde C++

photo-1423592707957-3b212afa6733_r

Muchos estamos acostumbrados a utilizar bases de datos en PHP pero cuando se trata de un programa de escritorio almacenamos los cambios en archivos sin contemplar esta posibilidad.

Usar una base de datos puede ser un gran aliado a la hora de hacer aplicaciones que almacenen gran cantidad de información o vayamos a acceder desde varios puntos a dicha información (programas multipuesto, por ejemplo).

También es de gran utilidad si construimos un software que haga más ligeras ciertas tareas dentro de un servidor web (necesitamos la posibilidad de ejecutar programas sobre el servidor y tal vez de compilarlos allí, pero es una opción bastante buena, en ocasiones un script puede ejecutarse de forma demasiado lenta.

El código que muestro a continuación es capaz de crear una base de datos, una tabla dentro de ella e introducir información si la base de datos no se encuentra. Si se encuentra la base de datos, listaremos la información que hay dentro de la tabla.
Aunque se pueden utilizar funciones y excepciones he preferido no hacerlo para el código de ejemplo, ¡eso es cosa vuestra!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <mysql++/mysql++.h>
#include <iostream>

using namespace std;

int main (){
   mysqlpp::Connection conn(false);
   char server[] = "localhost";
   char user[]   = "root";  // O cualquier usuario
   char pass[]   = "a9b8c7d6e5";

   if (conn.connect(NULL, server, user, pass))
   {
      // string consulta = "select * from ins_institutos";
     string consulta="SHOW DATABASES";
      mysqlpp::Query query = conn.query(consulta);
      if (mysqlpp::StoreQueryResult res = query.store())
      {
    cout << "Bases de datos encontradas: "<<res.num_rows()<<endl;
         if (res.num_rows() > 0)
       {
         bool poesiadb=false;
         // cout <<res[0]["nombre"] << endl;
         for (mysqlpp::StoreQueryResult::iterator it=res.begin(); it!=res.end(); ++it)
           {
         if ((it)->at(0)=="poesiadb")
           {
             poesiadb=true;
             break;
           }
         // Si queremos visualizar las bases de datos...
         cout <<"Base de datos: "<< (it)->at(0) << endl; // Se puede hacer con (*it)[0] pero la documentación dice que es más lento
           }
         if (poesiadb)
           {
         // Miramos los contenidos de la tabla
         cout << "La base de datos se encuentra" << endl;
         query.reset();
         query<<"SELECT * FROM `poesiadb`.`test`";
         res=query.store();
         if (res.num_rows() >0)
           {

             for (mysqlpp::StoreQueryResult::iterator it=res.begin(); it!=res.end(); ++it)
               {
             for (unsigned i=0; i<res.num_fields(); i++)
               cout <<res.field_name(i)<<" = "<< (it)->at(i) << endl; // Se puede hacer con (*it)[0] pero la documentación dice que es más lento

             cout << endl;
               }
             
           }
         else
           cout << "No se han obtenido datos" << endl;
           }
         else
           {
         // Lo construimos todo
         cout << "Creando base de datos" << endl;
         if (conn.create_db("poesiadb"))
           {
             cout << "Seleccionando base de datos" << endl;
             if (conn.select_db("poesiadb"))
               {
             cout << "Creando tabla" << endl;
             query.reset();
             query=conn.query("CREATE TABLE IF NOT EXISTS `poesiadb`.`test` ("
                      "`id` bigint(20) NOT NULL AUTO_INCREMENT,"
                      "`blog` varchar(100) NOT NULL,"
                      "`url` varchar(255) NOT NULL,"
                      "PRIMARY KEY (`id`)"
                      ") ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;");          
             if (query.execute())
               {
                 query.reset();
                 query << "INSERT INTO `test` VALUES (NULL, 'Poesia binaria', 'https://poesiabinaria.net/');";
                 if(!query.execute())
                   cout << "Fallo al introducir datos"<<endl;
                 query.reset();
                 query << "INSERT INTO `test` VALUES (NULL, 'Clase 911', 'http://clase911.com/');";
                 if(!query.execute())
                   cout << "Fallo al introducir datos"<<endl;
                 query.reset();
                 query << "INSERT INTO `test` VALUES (NULL, 'Ubuntizados', 'http://ubuntizados.com/');";
                 if(!query.execute())
                   cout << "Fallo al introducir datos"<<endl;
               }
             else
               cout << "Error al crear tabla"<<endl;
               }
             else
               cout << "Fallo al seleccionar la base de datos" << endl;
           }
         else
           cout << "Fallo al crear base de datos" << endl;
           }
       }
     else
       cout << "Fallo al obtener bases de datos" << endl;
      }
      conn.disconnect();
   }
   else
     cout <<"Fallo al conectarse a la BD: "<<conn.error()<<endl;
}

De cara a compilar esto, primero necesitaremos la biblioteca libmysql++, que en sistemas derivados de Debian podemos descargar así:

$ sudo apt-get install libmysql++ libmysql++-dev

Una vez descargado e instalado, para compilar el ejemplo debemos hacer:

$ g++ -o mysqlpp mysqlpp.c -lmysqlpp -I /usr/include/mysql++/ -I /usr/include/mysql

Hay muchos más ejemplos en la documentación o en el paquete de libmysql++-doc (depende de la distribución).

Actualización diciembre 2015: he colocado una preciosa foto de cabecera en el post

Foto: Mikhail Pavstyuk (Unsplash)

También podría interesarte....

There are 5 comments left Ir a comentario

  1. Pingback: Bitacoras.com /

  2. Pingback: BlogESfera.com /

  3. pmike /
    Usando Mozilla Firefox Mozilla Firefox 14.0.1 en Windows Windows 7

    Hace años hice una aplicacion de c++ con acceso a base de datos de MS Access, pero de MySql no la habia hecho.

    Saludos

  4. Gaspar Fernández / Post Author
    Usando Mozilla Firefox Mozilla Firefox 13.0.1 en Ubuntu Linux Ubuntu Linux

    @pmike
    Gracias por tu comentario

  5. Roberto Oñate /
    Usando Google Chrome Google Chrome 65.0.3325.162 en Linux Linux

    Me ha servido mucho tu ejemplo, y eso q ya han pasado años :). Gracias.

Leave a Reply to pmike Cancle Reply