Está en la página 1de 34

Programacin de aplicaciones MySQL con C

En este documento se da una introduccin al uso del AP C que proporciona MySQL para el
desarrollo de aplicaciones.
Autor: Jorge Jess Churruca
Fecha publicacin: 22 Junio del 2004
Acerca de esta gua
Este documento pretende ser no slo una traduccin del original (el cual viene junto al
manual de MySQL), sino tambin, un agregado con mejoras, resmenes, ms ejemplos de
cdigos, explicaciones ms detalladas, y las pginas "man" de las funciones ms importantes
(que no vienen con el original), etc., para hackers de MySQL. Actualmente se han omitido
algunas cosas, agregado otras, y se han hecho varios resmenes de diferentes documentos
para agregarlos al que se est leyendo en este momento. (En esta primera versin faltan
muchas cosas por hacer, las cuales saldrn publicadas en la segunda revisin)
Cosas por hacer
Agregar mas cdigos de ejemplo.
Terminar de traducir algunas cosas que faltan.
Hacer revisiones / correcciones al documento actual.
Nota: las cosas que faltan se muestran en detalle al final de este documento.
Crditos
[Documento fuente principal
- MySQL AB
- e-mail : info@mysql.com
- web : http://www.mysql.com
[Primer encargado del proyecto! traducciones! re"isiones! p#ginas man
- Jorge Jess Churruca "shock dude"
- email : jjch@ezrs.com
- email : jjch@bahialug.com.ar
- web : http://jjch.bahialug.com.ar
[Segundo encargado del proyecto! traducciones! re"isiones! cdigo
- Eduardo Zarate
- email : eduardo@mysql-hispano.org
- web : [http://www.mysql-hispano.org]
www.detodoprogramacion.com
[$tros cola%oradores! traducciones! ideas
- Luciano Faletti
- email: lucianobello@hotmail.com
- Lisandro Damian Nicanor Perez Meyer
- email: perezmeyer@infovia.com.ar
- email: Pablo "Zombie" Odorico
- zombie@bahialug.com.ar
&ntroduccin al AP& C
El cdigo del AP C de MySQL es distribuido en la librera mysqlclient que viene en el
paquete MySQL, y le permite a los programas en C acceder a bases de datos MySQL.
Resulta extremadamente trivial usar este AP, ya que por lo nico que el programador debe
preocuparse es por conocer "las estructuras" que estn creadas dentro de esta librera y por
los valores de retorno de algunas otras funciones. Son todas estructuras de las cuales
podemos hacer uso (llenarlas / modificarlas) desde programas externos; para ms
informacin se le puede echar un vistazo al cdigo fuente de "mysql.h" y mysqlclient. ( El AP
MySQL provee variables, funciones y estructuras listas para usar o llamar desde otros
programas, aunque por ahora lo nico que nos interesa es: para qu sirve cada funcin, y
que valores retornan.)
Muchos otras APs (excepto la del connector/J) usan la librera mysqlclient para comunicarse
con el servidor MySQL, esto significa que por ejemplo, se puede tomar ventajas de algunas
variables que son usadas por otros clientes ya que stas son referenciadas desde la librera
principal.
El cliente tiene un buffer de comunicacin con un tamao mximo. El tamao del buffer que
est establecido inicialmente (16KB) es automticamente incrementado al mximo (16M).
Como el tamao de los buffers es incrementado slo cuando esto se demanda, al
incrementar el lmite mximo definido no causa que ms recursos sean usados. Este control
del tamao es ms un control para consultas errneas y paquetes de comunicacin.
El buffer de comunicacin debe lo suficientemente grande para contener un sencilla
sentencia SQL (para el trfico cliente-servidor) y una fila de datos devueltos (para el trfico
servidor-cliente). Cada buffer de comunicacin de un thread es dinmicamente incrementado
para manejar cualquier consulta o fila arriba del lmite mximo. Por ejemplo, si se tienen
valores BLOB que contienen ms de 16M de datos, se debe tener un lmite de buffer de
comunicacin de al menos 16M (en ambos, cliente y servidor). El mximo definido por default
para el cliente es de 16M, pero el del servidor es de 1M. Sin embargo, este valor puede ser
incrementado al cambiar el valor del parmetro max_allowed_packet cuando se inicia el
servidor MySQL.
El servidor MySQL disminuye cada buffer de comunicacin a net_buffer_length luego de
cada consulta. Para los clientes, el tamao del buffer asociado con una conexin no es
disminuido hasta que la conexin es cerrada, en el momento en que la memoria del cliente
es reclamada.
En este documento no se incluye informacin sobre cmo construir programas que hagan
www.detodoprogramacion.com
uso de hilos (threads), sin embargo, s se comentar algo sobre la construccin de
aplicaciones standalone con el uso de la librera mysqld. Estas aplicaciones incluyen el
servidor y el cliente en el mismo programa, por lo que no se comunican con un servidor
MySQL externo.
'ipos de datos
Antes de comenzar con la descripcin de las funciones, vamos a revisar brevemente algunos
de los tipos de datos que forman parte del AP C de MySQL, mismos que son usados
amplamente en la creacin de programas.
M(SQL
Esta estructura es la ms importante y ms usada, ya que es la que maneja una conexin a
la base de datos. Es usada por casi todas las funciones del AP.
M(SQL)*+S
Esta estructura representa el resultado de una consulta que retorna filas (SELECT, SHOW,
DESCRBE, EXPLAN). La informacin retornada desde una consulta se conoce como el
conjunto de resultados (result set).
M(SQL)*$,
Representa una fila de datos. Actualmente es implementada como un arreglo de cadenas.
(Sin embargo estas cadenas tienen un tratamiento especial y no deben ser consideradas
como cadenas terminadas en null). Las filas son obtenidas al llamar a mysql_fetch_row().
M(SQL)-&+LD
Esta estructura contiene informacin sobre el nombre, tipo y tamao de un campo. Los
valores de los campos no son parte de esta estructura; ellos son contenidos en una
estructura MYSQL_ROW. Las estructuras MYSQL_FELD para cada campo se obtienen al
llamar a mysql_fetch_field() repetidamente.
M(SQL)-&+LD)$--S+'
Es la representacin de un offset dentro de una lista de campos. Un offset es el nmero de
un campo dentro de una fila, comenzando en cero.
my)ulonglong
El tipo usado para el nmero de filas y por mysql_affected_rows(), mysql_num_rows(), y
mysql_insert_id(). Este tipo provee un rango de valores de 0 a 1.84e19. En algunos sistemas,
el intentar mostrar un valor del tipo my_ulonglong no funcionar. Para imprimir cada uno de
estos valores, se debe convertir a unsigned long y usa el formato %lu de printf.
Por ejemplo:
printf("Nmero de filas: %lu", (unsigned long) mysql_num_rows(result));
www.detodoprogramacion.com
A continuacin se muestra como estn definidos los tipos de datos presentados
anteriormente, mismos que forman parte del cdigo fuente de MySQL (mysqlclient y mysql.h
).
Para ver informacin mas detallada se recomienda leer todos los ficheros fuente.
M(SQL
Estructura que maneja la conexin a una base de datos.
typedef struct st_mysql
{
NET net; /* Parmetros de comunicacin */
gptr connector_fd; /* ConectorFd para SSL */
char *host,*user,*passwd,*unix_socket,*server_version,*host_info,*info;
char *db;
struct charset_info_st *charset;
MYSQL_FELD *fields;
MEM_ROOT field_alloc;
my_ulonglong affected_rows;
my_ulonglong insert_id;
my_ulonglong extra_info; /* Usado por mysqlshow */
unsigned long thread_id; /* d para la conexin en el servidor */
unsigned long packet_length;
unsigned int port;
unsigned long client_flag,server_capabilities;
unsigned int protocol_version;
unsigned int field_count;
unsigned int server_status;
unsigned int server_language;
unsigned int warning_count;
struct st_mysql_options options;
enum mysql_status status;
my_bool free_me;
my_bool reconnect; /* Se fija a 1 para reconexin automtica */
char scramble[SCRAMBLE_LENGTH+1];
my_bool rpl_pivot;
struct st_mysql* master, *next_slave;
struct st_mysql* last_used_slave;
struct st_mysql* last_used_con;
LST *stmts; /* Lista de todas las sentencias */
const struct st_mysql_methods *methods;
void *thd;
} MYSQL;
M(SQL)*+S
Estructura que representa el resultado de una consulta que retorna filas.
typedef struct st_mysql_res {
www.detodoprogramacion.com
my_ulonglong row_count;
MYSQL_FELD *fields;
MYSQL_DATA *data;
MYSQL_ROWS *data_cursor;
unsigned long *lengths; /* Longitudes de columnas para la fila */
MYSQL *handle;
MEM_ROOT field_alloc;
unsigned int field_count, current_field;
MYSQL_ROW row;
MYSQL_ROW current_row; /* buffer para la fila actual */
my_bool eof; /* Usado por mysql_fetch_row */
const struct st_mysql_methods *methods;
} MYSQL_RES;
M(SQL)*$,
La representacin de una fila de datos.
typedef char **MYSQL_ROW; /* Regresa datos como un arreglo de cadenas*/
M(SQL)-&+LD
Estructura que contiene informacin de los campos.
typedef struct st_mysql_field {
char *name; /* Nombre del campo*/
char *org_name; /* Nombre original del campo, para los alias*/
char *table; /* El nombre de la tabla que contiene este campo*/
char *org_table; /* Nombre orig. de la tabla, si tabla fue un alias */
char *db; /* Base de datos de la tabla */
char *catalog;
char *def; /* El valor por default para este campo*/
unsigned long length; /* Ancho del campo*/
unsigned long max_length;
unsigned int name_length;
unsigned int org_name_length;
unsigned int table_length;
unsigned int org_table_length;
unsigned int db_length;
unsigned int catalog_length;
unsigned int def_length;
unsigned int flags; /* Diferentes banderas para el campo */
unsigned int decimals; /* Nmero de decimales en el campo */
unsigned int charsetnr; /* Conjunto de caracteres */
enum enum_field_types type; /* Tipo del campo */
} MYSQL_FELD;
El tipo del campo puede ser uno de los siguientes:
.alor Descripcin
FELD_TYPE_TNY campo TNYNT
FELD_TYPE_SHORT campo SMALLNT
FELD_TYPE_LONG campo NTEGER
FELD_TYPE_NT24 campo MEDUMNT
www.detodoprogramacion.com
FELD_TYPE_LONGLO
NG
campo BGNT
FELD_TYPE_DECMAL campo DECMAL OR NUMERC
FELD_TYPE_FLOAT campo FLOAT
FELD_TYPE_DOUBLE campo DOUBLE or REAL
FELD_TYPE_TMESTA
MP
campo TMESTAMP
FELD_TYPE_DATE campo DATE
FELD_TYPE_TME campo TME
FELD_TYPE_DATETM
E
campo DATETME
FELD_TYPE_YEAR campo YEAR
FELD_TYPE_STRNG campo CHAR
FELD_TYPE_VAR_STR
NG
campo VARCHAR
FELD_TYPE_BLOB
campo BLOB o TEXT(usar max_length para determinar la
longitud maxima)
FELD_TYPE_SET campo SET
FELD_TYPE_ENUM campo ENUM
FELD_TYPE_NULL campo tipo NULL
FELD_TYPE_CHAR (obsoleto) usar en su lugar FELD_TYPE_TNY
Se puede utilizar la macro S_NUM() para averiguar cuando un campo tiene un tipo
numrico. Se pasa el tipo a S_NUM() y sta retorna una valor TRUE si el campo es
numrico:
if(S_NUM(field->type))
printf("El campo es numrico");
El valor de las banderas puede tener cero o ms del siguiente conjunto de bits:
.alor Descripcin
NOT_NULL_FLAG El campo no puede ser NULL
PR_KEY_FLAG
El campo es parte de la clave primaria (primary key
)
UNQUE_KEY_FLAG El campo es parte de una clave nica
MULTPLE_KEY_FLAG El campo es parte de una clave no nica
UNSGNED_FLAG El campo tiene el atributo UNSGNED
ZEROFLL_FLAG El campo tiene el atributo ZEROFLL
BNARY_FLAG El campo tiene el atributo BNARY
AUTO_NCREMENT_FLAG El campo tiene el atributo AUTO_NCREMENT
www.detodoprogramacion.com
ENUM_FLAG El campo es un ENUM (obsoleto)
SET_FLAG El campo es un SET (obsoleto)
BLOB_FLAG El campo es un BLOB o TEXT (obsoleto)
TMESTAMP_FLAG El campo es un TMESTAMP (obsoleto)
El uso de las banderas BLOB_FLAG, ENUM_FLAG, SET_FLAG, y TMESTAMP_FLAG es
obsoleto porque ellas indican el tipo de un campo en vez de un atributo de su tipo. El
siguiente ejemplo ilustra un ejemplo tpico del uso de las banderas:
if(field->flags & NOT_NULL_FLAG)
printf("El campo no puede ser nulo");
M(SQL)-&+LD)$--S+'
La representacin de un offset dentro de una lista de campos.
typedef unsigned int MYSQL_FELD_OFFSET; /* offset para el campo actual */
*esumen de funciones del AP& C
Las funciones disponibles en el AP C son resumidas aqu y explicadas en mayor
detalle en la siguiente seccin.
-uncin Descripcin
mysql_affected_rows(
)
Devuelve el numero de filas
cambiadas/borradas/insertadas por la ltima
sentencia UPDATE, DELETE, o NSERT.
mysql_change_user()
Cambia de usuario y base de datos en una conexin
abierta.
mysql_character_set_
name()
Devuelve el nombre del conjunto de caracteres por
default para la conexin.
mysql_close() Cierra la conexin con el servidor.
mysql_connect()
Se conecta con un servidor MySQL, ahora esta
funcin es obsoleta, se debera usar
mysql_real_connect() en su lugar.
mysql_create_db()
Crea una base de datos. Esta funcin es obsoleta;
usar en su lugar el comando CREATE DATABASE.
mysql_drop_db()
Borra una base de datos. Esta funcin es obsoltea;
usar en su lugar el comando DROP DATABASE.
mysql_eof()
Determina cuando se ha ledo la ltima fila de un
conjunto de resultados. Esta funcin es obsoleta;
usar en su lugar mysql_errno() o mysql_error().
mysql_errno() Devuelve el nmero de error de la funcin MySQL
www.detodoprogramacion.com
invocada ms recientemente.
mysql_error()
Devuelve un mensaje de error de la funcin MySQL
invocada ms recientemente.
mysql_fetch_field() Devuelve el tipo del siguiente campo en la tabla.
mysql_fetch_fields() Devuelve un arreglo de todos los campos.
mysql_fetch_lengths()
Devuelve el largo de todas las columnas de la fila
actual.
mysql_fetch_row Recupera la siguiente fila del conjunto de resultados.
mysql_field_seek()
Pone el cursor de columna, en una columna
especifica.
mysql_field_count()
Devuelve el nmero de columnas para la consulta
ms reciente.
mysql_field_tell()
Devuelve la posicin del cursor de campo usado por
el ltimo mysql_fetch_field().
mysql_free_result()
Libera la memoria usada por un conjunto de
resultados.
mysql_get_client_info(
)
Devuelve la versin del cliente como una cadena.
mysql_get_host_info() Devuelve una cadena que describe la conexin.
mysql_get_version_se
rver()
Devuelve la versin del servidor como un valor
entero.
mysql_info()
Devuelve informacin acerca de la consulta
ejecutada ms recientemente.
mysql_init() Obtiene o inicializa una estructura MYSQL.
mysql_insert_id()
Devuelve el D generado por una columna
AUTO_NCREMENT en la consulta previa.
mysql_list_dbs()
Devuelve los nombres de las bases de datos que
coinciden con una expresin regular sencilla.
mysql_list_fields()
Devuelve los nombres de campos que coinciden con
una expresin regular sencilla.
mysql_list_processes(
)
Devuelve una lista de los threads actuales.
mysql_list_tables()
Devuelve los nombres de tablas que coinciden con
una expresin regular sencilla.
mysql_num_fields()
Devuelve el nmero de columnas en un conjunto de
resultados.
mysql_num_rows() Devuelve el nmero de filas en un conjunto de
www.detodoprogramacion.com
resultados.
mysql_options()
Configura opciones de conexin para
mysql_connect().
mysql_ping()
Permite verificar si la conexin con el servidor est
funcionando.
mysql_query() Ejecuta una consulta SQL.
mysql_real_connect() Permite establecer la conexin con el servidor.
mysql_select_db()
Selecciona la base de datos sobre la que se
ejecutarn las consultas.
mysql_shutdown() Apaga el servidor MySQL.
mysql_stat()
Devuelve el status actual del servidor como una
cadena.
mysql_store_result() Recupera un conjunto de resultados completamente.
mysql_use_result()
nicia una recuperacin fila-por-fila del conjunto de
resultados.
Descripcin de funciones
En la descripcin de las funciones que se har a continuacin, un parmetro con valor de
retorno NULL significa null en el sentido de la programacin en C , y no un null de
SQL/MySQL.
Las funciones que devuelven valores, generalmente devuelven un entero o un puntero, a no
ser que est especificado de otra forma, las funciones que retornan un puntero devuelven un
valor no nulo para indicar xito, o un valor nulo para indicar fracaso y las funciones que
retornan un entero devuelven cero para indicar xito o un valor distinto de cero para indicar
fracaso.
Resumiendo:
Una funcin que devuelve un puntero:
Valor no NULL = xito
Valor NULL = fracaso
Una funcin que devuelve un entero:
Devuelve 0 = xito
Devuelve distinto de 0 = fracaso.
www.detodoprogramacion.com
mys/l)affected)ro0s12
my_ulonglong mysql_affected_rows(MYSQL *mysql)
Descripcin
Devuelve el nmero de filas cambiadas por el ltimo UPDATE, eliminadas por el ltimo
DELETE o insertadas por el ltimo NSERT. Puede ser llamada inmediatamente despus de
mysql_query() para sentencias UPDATE, DELETE o NSERT. Para sentencias SELECT,
mysql_affected_rows() trabaja como mysql_num_rows().
.alores de retorno
Un entero mayor que cero indica el nmero de filas afectadas o recuperadas. Cero indica que
no se actualizaron registros para una sentencia UPDATE, no hubo filas que coincidieran con
la clusula WHERE en la consulta o que la consulta no ha sido ejecutada an.
+rrores
Ninguno.
+3emplo
mysql_query(&mysql,"UPDATE productos SET costo=costo*1.25 WHERE grupo=10");
printf("%ld productos actualizados",(long) mysql_affected_rows(&mysql));
mys/l)change)user12
my_bool mysql_change_user(MYSQL *mysql, const char *user,
const char *password,
const char *db)
Descripcin
Cambia el usuario y causa que la base de datos especificada por d% llegue a ser la base de
datos por default en la conexin especificada por mys/l. En las subsecuentes consultas,
esta base de datos es la default para la referencia a tablas que no incluyen una base de
datos explcita.
mysql_chance_user() falla a menos que el usuario conectado pueda ser autenticado o si no
tiene permisos para usar la base de datos. En este caso el usuario y la base de datos no son
cambiados. El parmetro d% puede ser puesto a NULL si no se tiene una base de datos por
default.
.alores de retorno
Cero para xito, y distinto de cero si ocurri un error.
+rrores
CR_COMMANDS_OUT_OF_SYNC, el comando fue ejecutado en un orden
inapropiado.
CR_SERVER_GONE_ERROR, el servidor MySQL no est disponible.
CR_SERVER_LOST, se perdi la conexin al servidor durante la consulta.
www.detodoprogramacion.com
CR_UNKNOWN_ERROR, ocurri un error desconocido.
ER_UNKNOWN_COM_ERROR, el servidor MySQL no tiene implementado el
comando.
ER_ACCESS_DENED_ERROR, el nombre de usuario o la contrasea son
incorrectas.
ER_BAD_DB_ERROR, la base de datos no existe.
ER_DBACCESS_DENED_ERROR, el usuario no tiene los privilegios para acceder a
la base de datos.
ER_WRONG_DB_NAME, el nombre de la base de datos es muy grande.
+3emplo
if (mysql_change_user(&mysql, "usuario", "password", "nueva_base_de_datos"))
{
fprintf(stderr, "Fallo al cambiar de usuario. Error: %s ",
mysql_error(&mysql));
}
mys/l)character)set)name12
const char *mysql_character_set_name(MYSQL *mysql)
Descripcin
Devuelve el conjunto de caracteres por default para la conexin actual.
.alores de retorno
El conjunto de caracteres por default.
+rrores
Ninguno.
+3emplo
Pendiente.
mys/l)close12
void mysql_close(MYSQL *mysql)
Descripcin
Cierra una conexin abierta previamente. mysql_close() tambin libera el espacio ocupado
por el manejador de conexin apuntado por mys/l si el manejador fue asignado
automticamente por mysql_init() o mysql_connect().
.alores de retorno
Ninguno.
+rrores
Ninguno.
+3emplo
www.detodoprogramacion.com
Pendiente.
mys/l)connect12
MYSQL *mysql_connect(MYSQL *mysql, const char *host,
const char *user,
const char *passwd)
Descripcin
Trata de establecer una conexin al servidor MySQL. (Es mejor usar mysql_real_connect()
en lugar de la funcin citada, ya que est quedando obsoleta.)
.alores de retorno
Los mismos que mysql_real_connect().
+rrores
Los mismos que mysql_real_connect().
+3emplo
Pendiente.
mys/l)create)d%12
int mysql_create_db(MYSQL *mysql, const char *db)
Descripcin
Crea la base de datos nombrada por el parmetro d%. Esta funcin se est quedando
obsoleta, es preferible usar mysql_query para ejecutar una sentencia SQL "CREATE
DATABASE".
.alores de retorno
Cero si la base de datos fue creada con xito. Distinto de cero si ocurri algn error.
+rrores
CR_COMMANDS_OUT_OF_SYNC, los comandos fueron ejecutados en un orden
inapropiado.
CR_SERVER_GONE_ERROR, el servidor no est disponible.
CR_SERVER_LOST, se perdi la conexin al servidor mientras se ejecutaba la
consulta.
CR_UNKNOWN_ERROR, ocurri un error desconocido.
+3emplo
if(mysql_create_db(&mysql, "mi_base_de_datos"))
{
fprintf(stderr, "Fallo al crear nueva base de datos. Error: %s",
mysql_error(&mysql));
}
www.detodoprogramacion.com
mys/l)data)see412
void mysql_data_seek(MYSQL_RES *result, my_ulonglong offset)
Descripcin
Busca una fila arbitraria en un conjunto de resultados. El valor offset es el nmero de una fila
y debe estar en el rango de 0 a mysql_num_rows(stmt)-1. Esta funcin requiere que la
estructura MYSQL_RES contenga el resultado completo de la consulta, de esta manera
mysql_data_seek() puede ser usado solo en conjuncin con mysql_store_result(), y no con
mysql_use_result().
.alores de retorno
Ninguno.
+rrores
Ninguno.
+3emplo
Pendiente.
mys/l)de%ug12
void mysql_debug(const char *debug)
Descripcin
Hace un DBUG_PUSH con la cadena dada. mysql_debug() usa la librera de depuracin
Fred Fish. Para usar esta funcin, se debe compilar la librera cliente con soporte para
debugging.
.alores de retorno
Ninguno.
+rrores
Ninguno.
+3emplo La llamada mostrada aqu causa que la librera cliente genere un trace file en el
archivo /tmp/client.trace de la mquina cliente.
mysql_debug("d:t:O,/tmp/client.trace");
mys/l)drop)d%12
int mysql_drop_db(MYSQL *mysql, const char *db)
Descripcin
Borra la base de datos nombrada por el parmetro d%. Esta funcin est quedando obsoleta,
se recomienda usar mysql_query() para ejecutar una sentencia SQL "DROP DATABASE".
.alores de retorno
Cero si la base de datos fue borrada. Diferente de cero si ocurri algn error.
www.detodoprogramacion.com
+rrores
CR_COMMANDS_OUT_OF_SYNC, el comando fue ejecutado en un orden
inapropiado.
CR_SERVER_GONE_ERROR, el servidor MySQL no est disponible.
CR_SERVER_LOST, se perdi la conexin al servidor durante la consulta.
CR_UNKNOWN_ERROR, ocurri un error desconocido.
+3emplo
if(mysql_drop_db(&mysql, "mi_base_de_datos"))
fprintf(stderr, "Fallo al eliminar la base de datos: Error: %s",
mysql_error(&mysql));
mys/l)eof12
my_bool mysql_eof(MYSQL_RES *result)
Descripcin
El uso de esta funcin est quedando obsoleto, en su lugar pueden ser usadas mysql_errno()
o mysql_error(). mysql_eof() determina si la ultima fila de un conjunto de resultados ha sido
leda. Si se obtiene un conjunto de resultados desde una llamada exitosa a
mysql_store_result(), el cliente recibe el conjunto completo en una sola operacin. En este
caso, si mysql_fetch_row() regresa un valor NULL significa que el final del conjunto de
resultados ha sido alcanzado y ya no es necesario llamar a mysql_eof(). Cuando se usa con
mysql_store_result(), mysql_eof() siempre regresa verdadero (true).
Por otra parte, si se usa mysql_use_result() para iniciar la recuperacin de un conjunto de
resultados, las filas del conjunto son obtenidas desde el servidor una por una cada vez que
se llama a mysql_fetch_row(). Debido a que puede ocurrir un error en la conexin durante
este proceso, si mysql_fetch_row() regresa un valor NULL, no significa necesariamente que
el final del conjunto de resultados se ha alcanzado. En este caso se puede hacer uso de
mysql_eof() para determinar lo que sucedi. mysql_eof() regresa un valor distinto de cero si
se llego al final del conjunto y cero si ocurri un error.
Histricamente mysql_eof() antecede a las funciones de error estndar mysql_errno() y
mysql_error(). Puesto que estas funciones de error proporcionan la misma informacin, su
uso es preferido sobre mysql_eof(), la cual es ahora desaprobada.
(En efecto, las funciones de error proporcionan mas informacin, ya que mysql_eof() regresa
solo un valor booleano mientras que estas funciones indican una razn para el error cuando
este ocurre.)
.alores de retorno
Cero si no ocurre un error. Distinto de cero si el final del conjunto de resultados ha sido
alcanzado.
www.detodoprogramacion.com
+rrores
Ninguno.
+3emplo
mysql_query(&mysql,"SELECT * FROM alguna_tabla");
result = mysql_use_result(&mysql);
while((row = mysql_fetch_row(result)))
{
// Hacer algo con los datos
}
if(!mysql_eof(result)) // mysql_fetch_row() fall debido a un error
{
fprintf(stderr, "Error: %s", mysql_error(&mysql));
}
Sin embargo, se puede obtener el mismo efectto con las funciones de error estndar de
MySQL:
mysql_query(&mysql,"SELECT * FROM alguna_tabla");
result = mysql_use_result(&mysql);
while((row = mysql_fetch_row(result)))
{
// Hacer algo con los datos
}
if(mysql_errno(&mysql)) // mysql_fetch_row() fall debido a un error
{
fprintf(stderr, "Error: %s", mysql_error(&mysql));
}
mys/l)errno12
unsigned int mysql_errno(MYSQL *mysql)
Descripcin
Para la conexin especificada por mys/l, mysql_errno() regresa el cdigo de error para la
funcin invocada ms recientemente, que puede fallar o ser exitosa. Un valor de retorno igual
a cero significa que no ocurri ningn error. Los nmeros de mensajes de error en el cliente
son listados en el archivo de cabecera 'errmsg.h'. Los nmeros de mensajes de error en el
servidor son listados en el archivo de cabecera 'mysqld_error.h'.
En la distribucin del cdigo fuente de MySQL se puede encontrar una lista completa de los
mensajes de error y sus correspondientes nmeros en el archivo 'docs/mysql_error.txt'. Los
cdigos de error en el servidor tambin son listados en la seccin 10.1 del manual de
MySQL.
Notar que algunas funciones como mysql_fetch_row() no fijan mysql_errno() si tienen xito.
Un principio a seguir es que todas las funciones que tienen que pedir informacin al servidor
reiniciarn mysql_errno() si tienen xito.
www.detodoprogramacion.com
.alores de retorno
Un valor de cdigo de error para la ultima llamada mysql_xxx(), si sta falla. Cero significa
que no ocurri ningn error.
+rrores
Ninguno.
+3emplo
Pendiente.
mys/l)error12
char *mysql_error(MYSQL *mysql)
Descripcin
Para la conexin especificada por mys/l, mysql_error() regresa una cadena terminada en
nulo (null) conteniendo el mensaje de error para la funcin invocada ms recientemente que
fall. Si una funcin no falla, el valor de retorno de mysql_error() puede ser el error previo o
una cadena vaca para indicar que no hubo error. Un principio a seguir es que todas las
funciones que tienen que pedir informacin al servidor reiniciarn mysql_error() si tienen
xito. Para funciones que reinician mysql_errno(), las siguientes dos pruebas son
equivalentes:
if(mysql_errno(&mysql))
{
// ocurri un error
}
if(mysql_error(&mysql)[0] != '0')
{
// ocurri un error
}
El lenguaje de los mensajes de error en el cliente puede ser cambiado recompilando la
librera cliente de MySQL. Actualmente se pueden elegir los mensajes de error en diferentes
lenguajes. .alores de retorno
Una cadena terminada en nulo (null) que describe el error. Una cadena vaca si no ocurri un
error.
+rrores
Ninguno.
+3emplo
Pendiente.
mys/l)fetch)field12
MYSQL_FELD *mysql_fetch_field(MYSQL_RES *result)
Descripcin
www.detodoprogramacion.com
Devuelve la definicin de una columna de un conjunto de resultados como una estructura
MYSQ_FELD. Se llama a esta funcin repetidamente para extraer informacin de todas las
columnas en el conjunto de resultados. mysql_fetch_field() devuelve NULL cuando no
quedan mas campos.
.alores de retorno
La estructura MYSQL_FELD para la columna actual. NULL si no hay ms columnas.
+rrores
Ninguno.
+3emplo
MYSQL_FELD *field;
while((field = mysql_fetch_field(result)))
{
printf("Nombre del campo %s", field->name);
}
mys/l)fetch)fields12
MYSQL_FELD *mysql_fetch_fields(MYSQL_RES *result)
Descripcin
Devuelve un arreglo de todas las estructuras MYSQL_FELD de un conjunto de resultados.
Cada estructura provee la definicin del campo de una columna del conjunto de resultados.
.alores de retorno
Un arreglo de estructuras MYSQL_FELD para todas las columnas de un conjunto de
resultados.
+rrores
Ninguno.
+3emplo
unsigned int num_fields;
unsigned int i;
MYSQL_FELD *fields;
num_fields = mysql_num_fields(result);
fields = mysql_fetch_fields(result);
for(i = 0; i < num_fields; i++)
{
printf("Campo %u es %s", i, fields[i].name);
}
mys/l)fetch)field)direct12
MYSQL_FELD *mysql_fetch_field_direct(MYSQL_RES *result, unsigned int fieldnr)
Descripcin
Dado el nmero fieldnr de una columna dentro del conjunto de resultados, devuelve la
definicin de campo de esa columna como una estructura MYSQL_FELD. Se puede usar
www.detodoprogramacion.com
esta funcin para conseguir la definicin de una columna arbitraria. El valor del campo debe
estar en el rango de 0 a mysql_num_fields(result)-1.
.alores de retorno
La estructura MYSQL_FELD para la columna especificada.
+rrores
Ninguno.
+3emplo
unsigned int num_fields;
unsigned int i;
MYSQL_FELD *field;
num_fields = mysql_num_fields(result);
for(i = 0; i < num_fields; i++)
{
field = mysql_fetch_field_direct(result, i);
printf("Campo %u es %s", i, field->name);
}
mys/l)fetch)lengths12
unsigned long *mysql_fetch_lengths(MYSQL_RES *result)
Descripcin
Devuelve las longitudes de las columnas de la fila actual dentro de un conjunto de resultados.
Si se planea copiar los valores de campo, esta informacin de longitud es tambin til para
optimizacin, ya que puede evitar llamar a strlen(). Adems, si el conjunto de resultados
contiene datos binarios, se debe usar esta funcin para determinar el tamao de los datos,
ya que strlen() devuelve resultados incorrectos para cualquier campo que contenga
caracteres nulos (null).
.alores de retorno
Un arreglo de enteros unsigned long representando el tamao de cada columna (sin incluir
ningn caracter terminado en null). NULL si ocurre algn error.
+rrores
mysql_fetch_lengths() es vlido solo para la fila actual del conjunto de resultados. Retorna
NULL si es llamado antes de llamar mysql_fetch_row() o despus de buscar todas las filas en
el resultado.
+3emplo
MYSQL_ROW row;
unsigned long *lengths;
unsigned int num_fields;
unsigned int i;
row = mysql_fetch_row(result);
if (row)
{
num_fields = mysql_num_fields(result);
lengths = mysql_fetch_lengths(result);
for(i = 0; i < num_fields; i++)
www.detodoprogramacion.com
{
printf("Columna %u es %lu bytes en longitud.", i, lengths[i]);
}
}
mys/l)fetch)ro012
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
Descripcin
Recupera la siguiente fila de un conjunto de resultados. Cuando es usado despus de
mysql_store_result(), mysql_fetch_row() devuelve NULL cuando no hay ms filas que leer.
Cuando es usado despus de mysql_use_result(), mysql_fetch_row() devuelve NULL cuando
no hay ms filas que recuperar o si ocurre algn error. El nmero de valores en la fila es
dado por mysql_num_fields(result). Si ro0 contiene el valor de devuelto por
mysql_fetch_row(), los punteros a los valores son accedidos como row[0] hasta
row[mysql_num_fields(result)-1]. Valores NULL en la fila son indicados por punteros NULL.
Las longitudes de los valores de los campos en la fila pueden ser obtenidos llamando a
mysql_fetch_lengths(). Campos vacos y campos que contegan NULL tienen longitud 0; se
les puede distinguir checando el puntero para el valor del campo. Si el puntero es NULL, el
campo es NULL; de otra forma, el campo esta vaco.
.alores de retorno
Una estructura MYSQL_ROW para la siguiente fila. NULL si no hay ms filas que recuperar o
si ha ocurrido un error.
+rrores
CR_SERVER_LOST, se perdi la conexin al servidor durante la consulta.
CR_UNKNOWN_ERROR, ocurri un error desconocido.
+3emplo
MYSQL_ROW row;
unsigned int num_fields;
unsigned int i;
num_fields = mysql_num_fields(result);
while ((row = mysql_fetch_row(result)))
{
unsigned long *lengths;
lengths = mysql_fetch_lengths(result);
for(i = 0; i < num_fields; i++)
{
printf("[%.*s] ", (int) lengths[i], row[i] ? row[i] : "NULL");
}
printf("n");
}
mys/l)field)count12
unsigned int mysql_field_count(MYSQL *mysql)
www.detodoprogramacion.com
Si se est usando una versin de MySQL anterior a la 3.22.24, se deber usar en cambio:
unsigned int mysql_num_fields(MYSQL *mysql).
Descripcin
Devuelve el nmero de columnas para la consulta ms reciente en la conexin mys/l. El uso
normal de esta funcin es cuando mysql_store_result() devuelve NULL (y por lo tanto no se
tiene un puntero al conjunto resultados). En este caso, se puede llamar a mysql_field_count()
para determinar si mysql_store_result() deba haber producido un resultado no vaco. Esto
permite al programa cliente tomar la accin adecuada sin saber si la consulta fue una
sentencia SELECT (o del tipo SELECT).
.alores de retorno
Un entero unsigned representando el nmero de campos en un conjunto de resultados.
+rrores
Ninguno.
+3emplo
MYSQL_RES *result;
unsigned int num_fields;
unsigned int num_rows;
if (mysql_query(&mysql,query_string))
{
// error
}
else // la consulta fue exitosa, se procesan los datos
{
result = mysql_store_result(&mysql);
if (result) // hay filas
{
num_fields = mysql_num_fields(result);
// recuperar las filas y entonces llamar a mysql_free_result(result)
}
else // mysql_store_result() no regres nada, deba ser as?
{
if(mysql_field_count(&mysql) == 0)
{
// la consulta no regres datos
// (sta no fue una consulta SELECT)
num_rows = mysql_affected_rows(&mysql);
}
else // mysql_store_result() debe tener los datos regresados
{
fprintf(stderr, "Error: %s", mysql_error(&mysql));
}
}
}
Una alternativa es reemplazar la llamada mysql_field_count(&mysql) con
mysql_errno(&mysql). En este caso, se esta checando directamente por un error de
mysql_store_result() ms que infiriendo del valor de mysql_field_count() si la sentencia fue
un SELECT.
www.detodoprogramacion.com
mys/l)init12
MYSQL *mysql_init(MYSQL *mysql)
Descripcin
Asigna o inicializa un objeto MYSQL adecuado para mysql_real_connect(). Si mys/l es un
puntero NULL la funcin asigna, inicializa y devuelve un nuevo objeto. De otra manera el
objeto es inicializado y la direccin de dicho objeto es regresada. Si mysql_init() asigna un
nuevo objeto, ste ser liberado cuando mysql_close() sea llamada para cerrar la conexin.
.alores de retorno
Un manejador MYSQL* inicializado. NULL si la memoria es insuficiente para asignar un
nuevo objeto.
+rrores
En caso de memoria insuficiente se devuelve NULL.
+3emplo
Pendiente
mys/l)4ill12
int mysql_kill(MYSQL *mysql, unsigned long pid)
Descripcin
Le pide al servidor que mate el hilo (thread) especificado por pid.
.alores de retorno
Cero en caso de xito. Distinto de cero si ocurri algn error.
+rrores
CR_COMMANDS_OUT_OF_SYNC, el comando fue ejecutado en un orden
inapropiado.
CR_SERVER_GONE_ERROR, el servidor MySQL no est disponible.
CR_SERVER_LOST, se perdi la conexin al servidor durante la consulta.
CR_UNKNOWN_ERROR, ocurri un error desconocido.
+3emplo
Pediente.
mys/l)num)ro0s12
my_ulonglong mysql_num_rows(MYSQL_RES *result)
Descripcin
Devuelve el nmero de filas en un conjunto de resultados.
www.detodoprogramacion.com
El uso de mysql_num_rows() depende del uso de mysql_store_result() o mysql_use_result()
para obtener el conjunto de resultados. Si se utiliza mysql_store_result(), mysql_num_rows()
puede ser llamada inmediatamente. Si se usa mysql_store_result(), mysql_num_rows() no
regresar el valor correcto hasta que todas las filas en el conjunto de resultados hayan sido
recuperadas.
.alores de retorno
El nmero de filas en el conjunto de resultados.
+rrores
Ninguno.
+3emplo
Pendiente.
mys/l)/uery12
int mysql_query(MYSQL *mysql, const char *query)
Descripcin
Ejecuta la consulta SQL especificada por la cadena /uery. La consulta debe consistir de una
sentencia SQL sencilla, y no se debe agregar el punto y coma (;) al final de la sentencia.
mysql_query() no puede ser usada por consultas que contengan datos binarios; en su lugar
debe ser usada la funcin mysql_real_query().
Si se desea conocer si la consulta debe regresar un conjunto de resultados o no, se puede
usar mysql_field_count() para checar esto.
.alores de retorno
Cero si la consulta fue exitosa. Distinto de cero si ocurri un error.
+rrores
CR_COMMANDS_OUT_OF_SYNC, el comando fue ejecutado en un orden
inapropiado.
CR_SERVER_GONE_ERROR, el servidor MySQL no est disponible.
CR_SERVER_LOST, se perdi la conexin al servidor durante la consulta.
CR_UNKNOWN_ERROR, ocurri un error desconocido.
+3emplo
Pendiente.
mys/l)real)connect12
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user,
const char *passwd, const char *db, unsigned int port,
www.detodoprogramacion.com
const char *unix_socket, unsigned long client_flag)
Descripcin
mysql_real_connect() intenta establecer una conexin con al servidor de bases de datos
MYSQL corriendo en un host. mysql_real_connect() debe completarse exitosamente antes
de poder ejecutar cualquier otra funcin, con la excepcin de mysql_client_info(). Los
parmetros son especificados como sigue:
El primer parmetro debe ser la direccin de una estructura MYSQL existente. Antes
de llamar a mysql_real_connect() es necesario llamar a mysql_init() para inicializar la
estructura MYSQL. Tambin se pueden cambiar varias opciones de conexin con la
llamada de mysql_options().
El valor de host puede un hostname o una direccin P. Si host es NULL o la cadena
"localhost", entonces se asume la conexin con el host local. Si el sistema soporta
sockets (Unix) o pipes (Windows) stos son usados en vez de TCP/P para conectarse
al servidor.
El parmetro user contiene el login para usuarios de MySQL. Si user es NULL o la
cadena vaca "", el usuario actual es asumido. Bajo Unix, este es el login actual. Bajo
otros sistemas es diferente.
El parmetro pass0d contiene el password de usuario. Si pass0d es NULL, slo
sern checadas las entradas en la tabla user que tengan un password vaco.
El parmetro d% es el nombre de la base de datos. Si d% no es NULL, la conexin
pondr la base de datos default a este valor.
Si port no es 0 (cero), dicho valor ser usado como nmero de puerto para
conexiones TCP/P. Notar que el parmetro host determina el tipo de la conexin.
.alores de retorno
Un manejador de conexin a MYSQL* si la conexin fue realizada con xito, y NULL si la
conexin fall. En una conexin exitosa, el valor de retorno es igual al valor del primer
parmetro.
+rrores
CR_CONN_HOST_ERROR, fallo al conectarse al servidor MySQL.
CR_CONNECTON_ERROR, fallo al conectarse al servidor MySQL local.
CR_PSOCK_ERROR, fallo al crear un socket P.
CR_OUT_OF_MEMORY, fuera de memoria.
CR_SOCKET_CREATE_ERROR, fallo al crear un socket Unix.
CR_UNKNOWN_HOST, fallo al localizar la direccin P del host.
CR_VERSON_ERROR, una incompatibilidad de protocolos result al intentar
conectarse al servidor con una librera cliente que usar una versin de protocolo
diferente.
CR_NAMEDPPEOPEN_ERROR, fallo al crear un pipe en Windows.
CR_NAMEDPPEWAT_ERROR, fallo al esperar un pipe en Windows.
CR_NAMEDPPESETSTATE_ERROR, fallo al obtener un pipe en Windows.
+3emplo
MYSQL mysql;
mysql_init(&mysql);
www.detodoprogramacion.com
mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"your_prog_name");
if (!mysql_real_connect(&mysql,"host","user","passwd","database",0,NULL,0))
{
fprintf(stderr, "Fallo al establecer la conexin: Error: %s",
mysql_error(&mysql));
}
mys/l)store)result12
MYSQL_RES *mysql_store_result(MYSQL *mysql)
Descripcin
Se debe llamar a mysql_store_result() o mysql_use_result() para cada consulta (SELECT,
SHOW, DESCRBE, EXPLAN) que recupere datos de manera exitosa.
No se tiene que llamar a mysql_store_result() o mysql_use_result() para otras consultas, sin
embargo no hay notables problemas de eficiencia si se llama a mysql_store_result() en todos
los casos.
Si de desea conocer si la consulta debe regresar un conjunto de resultados o no, se puede
usar mysql_field_count() para averiguar esto.
mysql_store_result() lee el resultado completo de la consulta y lo guarda en el cliente en una
estructura MYSQL_RES.
mysql_store_result() devuelve un puntero nulo si la consulta no devuelve un conjunto de
resultados (si la consulta fue, por ejemplo, un sentencia NSERT).
mysql_store_result() tambin devuelve un puntero nulo si falla la lectura del conjunto de
resultados. En este caso, se recomienda el uso de mysql_error() para averiguar que es lo
que fall.
Un conjunto de resultados vaco es regresado si la consulta no devuelve filas. (Un conjunto
de resultados vaco difiere de un puntero nulo)
Una vez que se ha llamado a mysql_store_result() y se obtiene un conjunto de resultados
que no es un puntero nulo, se puede llamar a mysql_num_rows() para determinar cuntas
filas hay en el conjunto de resultados.
Se puede llamar a mysql_fetch_row() para ir leyendo las filas del conjunto de resultados, o
mysql_row_seek() y mysql_row_tell() para obtener o fijar la posicin de la fila actual dentro
del conjunto de resultados. Se debe llamar a mysql_free_result() una vez que ya no se usar
www.detodoprogramacion.com
el conjunto de resultados.
.alores de retorno
Una estructura MYSQL_RES con los resultados. NULL si ocurri un error.
+rrores
CR_COMMANDS_OUT_OF_SYNC, el comando fue ejecutado en un orden
inapropiado.
CR_OUT_OF_MEMORY, fuera de memoria.
CR_SERVER_GONE_ERROR, el servidor MySQL no est disponible.
CR_SERVER_LOST, se perdi la conexin al servidor durante la consulta.
CR_UNKNOWN_ERROR, ocurri un error desconocido.
+3emplo
Pendiente.
mys/l)use)result12
MYSQL_RES *mysql_use_result(MYSQL *mysql)
Descripcin
Se debe llamar a mysql_store_result() o mysql_use_result() para cada consulta (SELECT,
SHOW, DESCRBE, EXPLAN) que recupere datos de manera exitosa.
mysql_use_result() inicializa la recuperacin de un conjunto de resultados pero no lee el
conjunto de resultados como lo hace mysql_store_result(). En este caso, cada fila es
recuperada individualmente al hacer llamadas a mysql_fetch_row(). Esta funcin lee los
resultados de una consulta directamente desde el servidor, sin la necesidad de almacenar los
resultados en el cliente, por lo que utiliza mucho menos memoria que mysql_store_result(). El
cliente asigna memoria nicamente para la fila actual y un buffer de comunicacin que puede
ser hasta de ma5)allo0ed)pac4et bytes.
Por el otro lado, no se debe usar mysql_use_result() si se est haciendo mucho
procesamiento de las filas en el lado del cliente.
Cuando se use mysql_use_result(), se debe ejecutar mysql_fetch_row() hasta que se
devuelva un valor NULL, de lo contrario, la filas no recuperadas sern devueltas como parte
del conjunto de resultados en la siguiente consulta.
No se puede usar mysql_data_seek(), mysql_row_seek(), mysql_row_tell(),
mysql_num_rows() o mysql_affected_rows() con se maneja un conjunto de resultados con
mysql_use_result(), sin embargo, una vez que se han recuperado todas las filas,
mysql_num_rows() s devuelve el total de filas.
www.detodoprogramacion.com
Se debe llamar a mysql_free_result() una vez que ya no se usar el conjunto de resultados.
.alores de retorno
Una estructura MYSQL_RES. NULL si ocurri un error.
+rrores
CR_COMMANDS_OUT_OF_SYNC, el comando fue ejecutado en un orden
inapropiado.
CR_OUT_OF_MEMORY, fuera de memoria.
CR_SERVER_GONE_ERROR, el servidor MySQL no est disponible.
CR_SERVER_LOST, se perdi la conexin al servidor durante la consulta.
CR_UNKNOWN_ERROR, ocurri un error desconocido.
+3emplo
Pendiente.
Creacin de programas cliente
A continuacin se presenta un breve ejemplo sobre el uso del AP C de MySQL. Este
programa de ejemplo debera de poder ser compilado y ejecutado en cualquier distribucin
de Linux.
Para el ejemplo que se va a mostrar, se usar la siguiente base de datos de prueba.
mysql> CREATE DATABASE dbtest;
Query OK, 1 row affected (0.00 sec)
mysql> use dbtest;
Database changed
mysql> CREATE TABLE tbltest(id int not null auto_increment,
-> datos varchar(255) default null,
-> primary key(id));
Query OK, 0 rows affected (0.08 sec)
mysql> GRANT ALL ON dbtest.* TO dbusr@localhost DENTFED BY "dbpwd";
Query OK, 0 rows affected (0.05 sec)
+sta%lecer la cone5in
Antes de poder mandar algn tipo de consulta al servidor, es necesario tener disponible una
conexin a la base de datos.
Para establecer la conexin a un servidor MySQL, se puede utilizar la funcin
mysql_connect(), o mysql_real_connect(), sin embargo, dado que el uso de mysql_connect()
est quedando obsoleto, se recomienda el uso de mysql_real_connect().
www.detodoprogramacion.com
Al intentar establecer la conexin, es necesario llamar a la funcin mysql_init() para inicializar
un manejador de conexin y posteriormente llamar a la funcin mysql_real_connect() con
dicho manejador (junto con otra otro informacin tal como el servidor, el nombre de usuario, y
la contrasea).

MYSQL mysql;
mysql_init(&mysql);
if (!mysql_real_connect(&mysql,"localhost","dbusr","dbpwd","dbtest",0,NULL,0))
{
printf("Fall en la conexin a la base de datos, Error: %s\n",
mysql_error(&mysql));
}
En este momento la funcin mysql_real_connect() pone la bandera "reconnect" (parte de la
estructura MYSQL) a un valor 1. Esta bandera indica que en el caso de que una consulta no
pueda ser ejecutada debido a que se perdi de la conexin, se intentar volver a establecer
la conexin al servidor antes de cancelar la ejecucin de la consulta. Cuando ya no se utilice
una conexin, se llama a la funcin mysql_close() para destruirla.
Para detectar y reportar errores, MySQL proporciona acceso a la informacin de los errores
por medio de las funciones mysql_errno() y mysql_error(). stas regresan el cdigo del error
o el mensaje de error para la funcin invocada ms recientemente, permitiendo determinar
cuando ocurri un error y cual fue.
+3ecucin de sentencias
Mientras una conexin est activa, el cliente puede enviar sentencias SQL al servidor usando
la funcin mysql_query().
Esta funcin toma como parmetros la conexin a la base de datos, y la consulta que se
quiere realizar. En caso de xito, se retorna un valor cero. En el caso especial que se
necesiten insertar datos binarios (los cuales puede incluir bytes nulos), se debe usar una
funcin relacionada llamada mysql_real_query(). Para el ejemplo que ser presentado aqu,
se har uso de mysql_query().
Nota: las consultas que se envian no deben terminar en punto y coma.
Sentencias SQL /ue no de"uel"en datos
Las sentencias no SELECT (NSERT, DELETE y UPDATE) son sentencias que no devuelven
datos, y por lo tanto son ms sencillas de usar.
Para cada consulta de este tipo se puede averiguar cuntas filas fueron cambiadas (o bien
www.detodoprogramacion.com
afectadas) al llamar a la funcin mysql_affected_rows().
mysql_query(&mysql, "NSERT NTO tbltest VALUES(0,'Dato de prueba A')");
if(mysql_affected_rows(&mysql) > 0)
printf("%lu registro insertado. ",
(unsigned long)mysql_affected_rows(&mysql));
else
printf("Fallo al insertar el registro, Error: %s", mysql_error(&mysql));
Por razones de portabilidad, la funcin mysql_affected_rows() devuelve un valor especial que
representa un entero sin signo. Para usar la funcin printf(), se recomienda que se haga un
cast a unsigned long, con un especificacin de formato %lu.
Antes de insertar datos en una base de datos generalmente se deben escapar todos los
caracteres especiales, esto es, aquellos caracteres que para MySQL tienen un significado
especial. La funcin mysql_real_escape_string() es usada para este propsito. Esta funcin
toma como parmetros un objeto MYSQL, un buffer para almacenar los datos codificados,
los datos originales, y la longitud de los datos originales. Al usar esta funcin debemos
asegurarnos de que el buffer sea del doble de tamao que los datos originales, con un byte
extra para el caracter NULL al final de la cadena.
Sentencias /ue de"uel"en datos
Para leer los registros de una base de datos se envia una sentencia SELECT tambin con el
uso de la funcin mysql_query().
Para consultas SELECT, se obtienen las filas seleccionadas como un conjunto de resultados.
(Notar que algunas sentencias son similares a un SELECT en el sentido de que tambin
devuelven filas. Estas incluyen SHOW, DESCRBE, y EXPLAN, y deben ser tratadas de la
misma manera que una sentencia SELECT).
Hay dos formas en las que un cliente puede procesar un conjunto de resultados. Una de ellas
es recuperar en el momento el conjunto de resultados completo al llamar a la funcin
mysql_store_result(). Esta funcin obtiene desde el servidor todas las filas regresadas por la
consulta y los almacena en el cliente. La segunda forma es que el cliente recupere fila por fila
del conjunto de resultados al llamar a la funcin mysql_use_result(). Esta funcin inicializa la
recuperacin de los datos, pero realmente no obtiene ninguna fila desde el servidor.
En ambos casos, el acceso a las filas se hace con la funcin mysql_fetch_row(). Con
mysql_store_result(), mysql_fetch_row() accede las filas que ya han sido recuperadas desde
el servidor. Con mysql_use_result(), mysql_fetch_row() recupera solo una fila desde el
servidor. La informacin acerca del tamao de los datos en cada fila esta disponible al llamar
a la funcin mysql_fetch_lengths().
www.detodoprogramacion.com
mysql_query(&conn, "SELECT * FROM tbltest");
res = mysql_store_result(&conn);
for(i=0; i< mysql_num_rows(res); i++)
{
row = mysql_fetch_row(res);
printf("%s %s n", row[0], row[1]);
}
mysql_free_result(res);
Despus de que se ha trabajado con el conjunto de resultados, se llama a la funcin
mysql_free_result() para liberar la memoria usada por este. Los dos mecanismos de
recuperacin son complementarios. Los programas cliente deben elegir el enfoque que sea
mas apropiado para sus requerimientos. En la practica, los programas cliente usan
mysql_store_result() mas comnmente. Una ventaja de usar mysql_store_result() es que
debido a que todas las filas han sido recuperadas por el cliente, no solo se pueden acceder a
ellas secuencialmente, es decir, se pueden acceder las filas hacia adelante y hacia atrs en
el conjunto de resultados usando mysql_data_seek() o mysql_row_seek() para cambiar la
posicin de la fila actual dentro del conjunto de resultados.
Tambin se puede averiguar cuantas filas existen al llamar a la funcin mysql_num_rows().
Por otra parte, los requerimientos de memoria al usar mysql_store_result() pueden ser muy
altos para conjuntos de resultados muy grandes y se pueden encontrar condiciones de falta-
de-memoria.
Una ventaja de usar mysql_use_result() es que el cliente requiere menos memoria porque
este mantiene nicamente una fila a la vez. Las desventajas son que se tiene que procesar
cada fila rpidamente para evitar conflictos en el servidor, no se tiene acceso aleatorio dentro
del conjunto de resultados (las filas se pueden acceder solo secuencialmente), y no se puede
conocer cuantas filas hay en el conjunto de resultados hasta que se recuperen todas las filas.
Adems, se tienen que recuperar todas las filas aun si a la mitad del conjunto de resultados
se determina que se ha encontrado la informacin que se estaba buscando.
El AP hace posible que los clientes respondan apropiadamente a consultas (recuperando
filas slo cuando sea necesario) sin conocer cuando la consulta es o no un SELECT. Se
puede hacer esto al llamar a mysql_store_result() despus de cada mysql_query() ( o
mysql_real_query()). Si la llamada al conjunto de resultados sucede, la consulta fue un
SELECT y se pueden leer las filas.
Si la llamada al conjunto de resultados falla, se puede llamar a la funcin mysql_field_count()
para determinar cuando un resultado fue el esperado. Si mysql_field_count() regresa cero, la
consulta no regreso datos (lo que indica que fue un NSERT, UPDATE, DELETE, etc.), y no
se esperaba que regresaran filas. Si mysql_field_count() es distinto de cero, la consulta debi
regresar filas, pero no lo hizo. Lo que indica que la consulta fue un SELECT que fallo.
Revisar la descripcin de la funcin mysql_field_count() para ver un ejemplo de como puede
ser utilizada.
www.detodoprogramacion.com
Ambos mysql_store_result() y mysql_use_result() permiten obtener informacin acerca de los
campos que componen el conjunto de resultados (el nmero de campos, sus nombres y
tipos, etc). Se puede acceder la informacin de los campos secuencialmente dentro de la fila
al llamar a la funcin mysql_fetch_field() repetidamente, o por el nmero de campo dentro de
la fila al llamar a la funcin mysql_fetch_field_direct(). La posicin actual del cursor en el
campo puede ser cambiada al llamar a mysql_field_seek(). Al fijar el cursor en el campo se
afectan las subsecuentes llamadas a mysql_fetch_field(). Tambin se puede obtener la
informacin de todos los campos a la vez al llamar a la funcin mysql_fetch_fields().
Ejemplo completo
#include <stdlib.h>
#include <mysql.h>

int main (int argc, char *argv[])
{
MYSQL mysql;
MYSQL_ROW row;
MYSQL_RES *res;

char *query;
int i=0;

mysql_init(&mysql);
if (!mysql_real_connect(&mysql,"localhost","dbusr","dbpwd","dbtest",0,NULL,0))
{
printf("Fallo en la conexin a la base de datos, Error: %s\n",
mysql_error(&mysql));
}
else
{
printf("Conexin a la base de datos establecida... \n");

query = malloc(strlen(argv[1]) + 255);
sprintf(query, "NSERT NTO tbltest VALUES(0,'%s')", argv[1]);
mysql_query(&mysql, query);

if(mysql_affected_rows(&mysql) > 0)
printf("%lu registro insertado. \n", (unsigned long)mysql_affected_rows(&mysql));
else
printf("Fallo al insertar el registro, Error: %s \n",
mysql_error(&mysql));

mysql_query(&mysql, "SELECT * FROM tbltest");
res = mysql_store_result(&mysql);

for(i=0; i< mysql_num_rows(res); i++)
www.detodoprogramacion.com
{
row = mysql_fetch_row(res);
printf("%s \t\t %s \n", row[0], row[1]);
}

mysql_free_result(res);
mysql_close(&mysql);
}

return 0;
}
Compilacin
Todos los programas que accedan a bases de datos MySQL deben incluir el archivo de
cabecera mys/l6h, y al momento de la compilacin deben ser enlazados con la librera
mys/lclient, al agregar las opciones "-libmysqlclient -lz ".
Si no se encuentran las libreras, es muy probable que se tenga que especificar la ruta a ellas
(ej: -L/usr/local/lib, -L/usr/local/mysql/lib, etc.)
De manera similar, si no se encuentran los archivos de cabecera de MySQL, se deber
especificar la ruta a ellos (ej: -/usr/local/include, -/usr/local/mysql/include, etc.)
En este caso se tiene instalado MySQL 4 en el directorio /usr/local/mysql. La compilacin
queda de la siguiente manera:
gcc -o test test.c -/usr/local/mysql/include -L/usr/local/mysql/lib -lmysqlclient -lz
Mane3ando e3ecucin de m7ltiples consultas
Desde la versin 4.1 MySQL soporta la ejecucin de mltiples sentencias especificadas en
una sola consulta. Para usar esta capacidad en una conexin dada, se necesita especificar la
opcin CLENT_MULT_QUERES en los parmetros de mysql_real_connect() cuando se
abre la conexin. Se puede tambin fijar el valor para una conexin al llamar
mysql_set_server_option(MYSQL_OPTON_MULT_STATEMENTS_ON).
Por defecto mysql_query() y mysql_real_query() devuelven solamente el primer status de la
consulta y los siguientes status se pueden procesar usando mysql_more_results() y
mysql_nex_results().
+3emplo
/* Conecta al servidor con la opcin CLENT_MULT_QUERES */
mysql_real_connect(..., CLENT_MULT_QUERES);
/* ejecuta varias consultas */
www.detodoprogramacion.com
mysql_query(mysql,"DROP TABLE F EXSTS test_table;
CREATE TABLE test_table(id NT);
NSERT NTO test_table VALUES(10);
UPDATE test_table SET id=20 WHERE id=10;
SELECT * FROM test_table;
DROP TABLE test_table";
do
{
/* Procesa todos los resultados */
...
printf("Total de filas afectadas: %lld", mysql_affected_rows(mysql));
...
if (!(result= mysql_store_result(mysql)))
{
printf(stderr, "Error al procesar la consulta.\n");
exit(1);
}
process_result_set(result); /* funcin cliente */
mysql_free_result(result);
} while (!mysql_next_result(mysql));
Ser"idor em%e%ido 1em%edded ser"er2
Nota: ahora ya no se est hablando de la librera mys/lclient sino de la librera mys/ld.
Se necesitan las siguientes funciones para permitir a las aplicaciones ser enlazadas a las
libreras del servidor MySQL embebido (embedded server). Si el programa es enlazado con
libmysqlclient en lugar de lmysqld, estas funciones no hacen nada. Esto hace posible elegir
entre usar el servidor embebido y un servidor stand-alone sin hacer ninguna modificacin de
cdigo.
mys/l)ser"er)init12
int mysql_server_init(int argc, char **argv, char **groups)
Descripcin
La funcin necesita ser llamada una vez en el programa usando el servidor embebido antes
de llamar a ninguna otra funcin. Esto arranca el servidor e inicializa cualquier otro
subsistema (mysys, nnoDB, etc) que use el servidor. Si esta funcin no es llamada el
programa fallar.
Los argumentos argc y argv son anlogos a los argumentos de main(). El primer elemento de
argv es ignorado (por lo general contiene el nombre del programa). Por conveniencia, argc
puede ser 0 (cero) si no hay argumentos de lnea de comandos para el servidor.
mysql_server_init() hace una copia de los argumentos as que se puede destruir argv o
groups de manera segura despus de la llamada mysql_server_init().
.alores de retorno
www.detodoprogramacion.com
0 si est todo bien, 1 si ocurri un error.
+3emplo
#include
#include
static char *server_args[] = {
"this_program", /* Esta cadena no es usada */
"--datadir=.",
"--key_buffer_size=32M"
};
static char *server_groups[] = {
"embedded",
"server",
"this_program_SERVER",
(char *)NULL
};
int main(void) {
mysql_server_init(sizeof(server_args) / sizeof(char *), server_args, server_groups);
/* Usar aqu cualquier funcin del AP MySQL */
mysql_server_end();
return EXT_SUCCESS;
}
mys/l)ser"er)end12
void mysql_server_end(void)
Descripcin
Esta funcin necesita ser llamada una vez en el programa despus de todas las otras
funciones. Esta funcin propiamente dicha sirve para apagar el servidor.
.alores de retorno
Ninguno.
Por hacer 666
Falta mucho por hacer, desde correcciones, ejemplos de cdigo y resmenes, hasta una
ltima parte de la traduccin de la gua oficial (la cual se encuentra en el directorio
Docs/manual_toc.html del paquete MySQL). Si ests interesado en participar o enviar
cualquier tipo de ayuda, por favor contctate con nosotros.
Actualmente estamos trabajando en las siguientes secciones:
9.1.4 C AP Prepared Statements
9.1.5 C AP Prepared Statement Datatypes
9.1.6 C AP Prepared Statement Function Overview
9.1.7 C AP Prepared Statement Function Descriptions
9.1.9 C AP Handling of Date and Time Values
9.1.10 C AP Threaded Function Descriptions
www.detodoprogramacion.com

También podría gustarte