Acceso a los datos MySQL desde C

Ahora que conocemos las nociones básicas sobre MySQL, vamos a explorar cómo acceder a MySQL desde nuestra aplicación, en vez de usar herramientas GUI o el cliente básico mysql.

Podemos acceder a MySQL a través de diferentes lenguajes:

  • C
  • C++
  • Java
  • Perl
  • Phyton
  • Eiffel
  • Tcl
  • Ruby
  • PHP

Existe un driver ODBC para acceder a MySQL desde las aplicaciones propias de Windows, como Access, incluso para Linux aunque no tenemos motivos para usarlo. Nos centraremos solamente en la interfaz C porque la misma biblioteca facilita mucho la conexión a través de otros lenguajes.

Rutinas de conexión

Conectarse a la base de datos MySQL desde C supone dos pasos:

  • Iniciar una estructura de gestión de conexiones.
  • Realizar la conexión físicamente.

Primero usaremos mysql_init para iniciar su gestor de conexiones:

mysql_1

Normalmente, transmitirá NULL a la rutina, y se retornará un indicador de una estructura de conexión  recientemente ubicada. Si llegara a transmitir una  estructura existente, se volverá a iniciar. Si se produce un error, aparecerá NULL.

De momento, solo hemos  asignado e iniciado una estructura. Aún necesitamos proporcionar a los parámetros una conexión usando mysql_real_connect:

mysql_2b

 mysql_4

mysql_7

Si no se puede realizar la conexión, normalmente cuando se finaliza el programa, llamaremos a mysql_close mediante:

mysql_closeDe esta manera se cerrará la conexión. Si mysql_init realizó la conexión, la estructura se liberará. El indicador dejará de ser válido y no se podrá a volver a usar. Si dejamos una conexión abierta innecesariamente sería malgastar los recursos inútilmente, pero volver a abrir una conexión conlleva unos gastos adicionales, así que aplíquelo según su criterio cuando use una de esas dos opciones.

 La rutina mysql_options (que se puede solicitar únicamente entre mysql_init y mysql_real_conect) le permite establecer ciertas opciones:

mysql_option

Como mysql_options es capaz es capaz de establecer una opción cada vez, tenemos que llamarla cada vez que tengamos que configurar una opción. La podemos usar tantas veces como lo necesitemos, siempre y cuando todos los usuarios aparezcan entre mysql_init y mysql_real_connect. No todas las opciones son de tipo char, que ha de ser emitida como const char*. Las tres opciones más comunes son:

opciones_mysqlSi la llamada tiene éxito se envía un cero. Como sirve sólo para establecer indicadores, el fallo siempre significa que hemos usado una opción no válida.

Para establecer el tiempo de espera de la conexión en 9 segundos, use un fragmento de código de tipo:

tiempo_conexion

Vamos a ejecutar un breve programa para comprobar lo que hemos estudiado.

Comience estableciendo una nueva contraseña para el usuario (rick para el localhost, en el siguiente código) y después cree una base de datos que llamaremos “loquesea“, que será con la que se va a conectar. Todo esto le debería sonar, de manera que únicamente vamos a mostrar la secuencia tal como se ejecuta:

 Nos mostrará la pantalla de bienvenida:

mysql_paso1

Después de mostrarnos la pantalla de bienvenida establecemos una nueva contraseña para rick:

mysql_paso2

Después de haber asignado una nueva contraseña para rick, salimos de la consola mysql:

mysql_paso3

Volvemos a entrar, esta vez como el usuario rick:

mysql_paso4

Acto seguido vamos a crear la Base de datos que llamaremos loquesea y salimos de la consola mysql.

mysql_paso5

Ahora ya tenemos creada la nueva base de datos de ejemplo. En vez de escribir muchos comandos para crear y completar las tablas directamente en la línea de comando del mysql, vamos a crear un archivo que contenga todos los comandos necesarios y que llamaremos crea_alumnos.sql:

mysql_paso6

Ahora que hemos escrito y guardado el archivo volvemos a mysql, seleccionando la base de datos loquesea, y ejecutando este archivo que hemos creado:

mysql_7Si hemos entrado, despues de la pantalla de bienvenida insertaremos nuestro archivo crea_alumnos.sql:

mysql_paso8

El mensaje Query OK, …, nos dice que se insertaron los campos satisfactoriamente.

Ahora que disponemos de un usuario, de una base de datos y de una tabla que contiene información, ha llegado el momento de ver cómo podemos acceder a los datos desde C.

Creamos este ejemplo con el nombre connect1.c, que se se conecta con un servidor en el ordenador local, como usuario rick con la contraseña secret, con la base de datos loquesea:

connecta1_listadoCompilamos el programa y observamos el resultado. Posiblemente tengamos que incluir la ruta include y una ruta de biblioteca, así como especificar que hay que vincular el archivo con el módulo de biblioteca mysqlclient. En algunos sistemas también necesitará -lz, para vincular la biblioteca de compresión. De momento probaremos este método de compilación:

connect1_compilar

Puede que tengamos que comprobar la instalación de nuestros paquetes del cliente y su ubicación, que depende de su distribución, y ajustar la línea de compilación anterior de acuerdo con dichos parámetros.

Cuando lo ejecute, debería mostrar el mensaje que indica que la conexión tuvo éxito:

connect1_conectado

 Gestión de errores

 Antes de ver otros programas más sofisticados, conviene ver como se gestiona MySQL los errores. MySQL usa varios códigos de retorno que presentan la estructura de gestión de la conexión. Las dos rutinas de uso obligatorio son:

gestion_errores_1

 Puede recuperar el código de error, que suele ser un valor distinto de 0, llamando a mysql_errno y transmitiendo la estructura de conexión. Si no se ha configurado el código de error, se envía cero. Como el código se actualiza cada vez que se realiza una llamada a la biblioteca, puede recuperar el código de error únicamente para el último comando ejecutado,  a excepción de estas dos rutinas de error, que no provocan la actualización del código de error.

El valor de retorno es el código de error, y estos valores se definen tanto en el archivo errmsg.h include como en mysqld_error.h. Se pueden encontrar en el directorio MySQL include. El primero informa de los errores por parte del cliente, y el segundo se centra en los errores específicos del sistema.

Si queremos un mensaje textual de error, podemos llamar a mysql_error, que proporciona un mensaje de texto totalmente comprensible. El mensaje de texto escribe en algún espacio de la memoria estática interna, por eso hay que copiarlo en otro sitio si desea guardar el texto de error.

 Con el fin de verlo todo en acción, podemos añadir una gestión de errores rudimentaria. Sin embargo probablemente, es posible que surja algún problema porque mysql_real_connect envía un indicador NULL si se produce un fallo, privándole del código de error. Si hace que la conexión gestione una variable, puede seguir llegando a ella como si mysql_real_connect fallase.

 Vamos a ver seguidamente connect2.c, que nos muestra cómo usar la estructura de conexión cuando no se asigna de manera dinámica, y muestra también cómo debería escribir el código de gestión de errores básico,

connect2_listado

Podemos generar un error intencionadamente eligiendo un usuario o contraseña incorrecta, y seguirá obteniendo un código de error parecido al que ofrece la herramienta mysql.

connect2_salida

atras2

 

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s