2 Consultas

Ahora que ya sabemos cómo establecer una conexión con el servidor MySQL y cómo cerrar esa conexión, veamos cómo podemos hacer consultas SQL desde nuestros programas C/C++.

Seleccionar una base de datos

Para acceder a la información almacenada en una base de datos, debemos hacer referencia a la base de datos mediante su nombre. En el cliente MySQL usamos la orden USE para seleccionar una base de datos por defecto.

Usando el API hemos visto que podemos seleccionar la base de datos en la llamada a la función mysql_real_connect(). Pero si queremos cambiar la base de datos por defecto durante la ejecución no será necesario cerrar la conexión y abrir una nueva, podemos usar en su lugar la función mysql_select_db():

   if(mysql_select_db(myData, "prueba")) \{
      // Error al seleccionar base de datos.
      cout << "ERROR: " << mysql_error(myData) << endl;
      mysql_close(myData);
      rewind(stdin);
      getchar();
      return 2;
   }

La función mysql_select_db() hace que la base de datos especificada como segundo parámetro sea considerada la base de datos por defecto en las siguientes consultas. En rigor esto no es imprescindible, ya que podemos acceder a una tabla mediante el especificador de base de datos y el nombre de la tabla, pero si todas las consultas se van a hacer sobre la misma base de datos, esto nos ahorrará mucho trabajo (de escritura).

Si el valor de retorno de la función es distinto de cero, indica que se ha producido un error. En este ejemplo hemos usardo la función mysql_error para mostrar un mensaje de error que indique el motivo.

Esta función puede fallar por varios motivos, pero de momento sólo nos preocupa si el error es provocado porque la base de datos no existe, en ese caso obtendremos el error ER_BAD_DB_ERROR.

Seleccionar datos de una tabla

La primera operación que intentaremos sobre la base de datos es leer algunos registros de una tabla. Empezaremos por una consulta sencilla, leyendo todos los registros de la tabla 'gente'.

Nota: supondremos que tal tabla ya existe y que contiene datos, pero si no es así en tu caso, puedes crearla y añadir datos desde la consola siguiendo los pasos del curso de MySQL: crear base de datos, crear una tabla, insertar filas.

La consulta que vamos a hacer es:

SELECT * FROM gente;

Necesitamos usar una sentencia SQL, en este caso una sentencia SELECT.

Para incluir consultas dentro de programas C/C++ se usan dos funciones del API C de MySQL, mysql_query o mysql_real_query. En ambos casos, primer parámetro es, como siempre, un manipulador de un objeto MYSQL iniciado; el segundo contiene la cadena con la consulta o instrucción SQL a ejecutar.

La función mysql_real_query usa un tercer parámetro, que el la longitud de la cadena que contiene la consulta. Esta función permite usar consultas binarias, es decir, que la cadena de la consulta puede contener caracteres nulos.

mysql_query(myData, "SELECT * FROM gente");

Veamos un ejemplo de cómo lanzar esta consulta:

   // Hacer una consulta con el comando "SELECT * FROM gente":
   if(mysql_query(myData, "SELECT * FROM gente")) \{
      // Error al realizar la consulta:
      cout << "ERROR: " << mysql_error(myData) << endl;
      mysql_close(myData);
      rewind(stdin);
      getchar();
      return 2;
   }

Recuperar datos de una base de datos

Ya hemos hecho una consulta mediante SELECT, ahora mostraresmos el proceso para recuperar los resultados de esa consulta. Por cierto, otras consultas también generan conjuntos de resultados, como SHOW TABLES o SHOW DATABASES, y el tratamiento de esos resultados es el mismo.

Lo primero es recuperar el conjunto de resultados procedente del servidor MySQL, para ello se usa la función mysql_store_result.

La función mysql_store_result requiere como parámetro un objeto MYSQL, con la conexión actual y devuelve un puntero a una estructura MYSQL_RES.

Del mismo modo, una vez procesados los resultados, se deben liberar mediante una llamada a la función mysql_free_result. Esto liberará la memoria usada por el conjunto de resultados, es decir, por la estructura MYSQL_RES.

// Almacenar el resultado de la consulta, lo necesitaremos después:
if((res = mysql_store_result(myData))) \{
   // Procesar resultados
   ...
   // Liberar el resultado de la consulta:
   mysql_free_result(res);
}

Una vez obtenido el conjunto de resultados, disponemos de varias funciones que podemos aplicar sobre él.