|
|
Este documento está disponible en los siguientes idiomas: English Castellano ChineseGB Deutsch Francais Nederlands Portugues Russian Turkce Polish |
por Özcan Güngör <ozcangungor(at)netscape.net> Sobre el autor: Uso Linux desde 1997. Libertad, flexibilidad y Código Abierto. Son las características que me gustan. Traducido al español por: Carlos González Pérez <charly(en)galpon.org> Contenidos: |
La Interfaz de Programación de Aplicaciones -API- de MySQLResumen:
En este artículo, aprenderemos a usar el API (Interfaz de
Programación de Aplicaciones) que viene con MySQL. Para
poder entender este artículo, necesitas tener algunas nociones
sobre:
|
MYSQL
La siguiente estructura es la del manejador de comunicaciones que se
usa para conectarse a una base de datos.
typedef struct st_mysql {
NET net; /* Communication parameters */
gptr connector_fd; /* ConnectorFd for SSL */
char *host,*user,*passwd,*unix_socket,
*server_version,*host_info,*info,*db;
unsigned int port,client_flag,server_capabilities;
unsigned int protocol_version;
unsigned int field_count;
unsigned int server_status;
unsigned long thread_id; /* Id for connection in server */
my_ulonglong affected_rows;
my_ulonglong insert_id; /* id if insert on table with NEXTNR */
my_ulonglong extra_info; /* Used by mysqlshow */
unsigned long packet_length;
enum mysql_status status;
MYSQL_FIELD *fields;
MEM_ROOT field_alloc;
my_bool free_me; /* If free in mysql_close */
my_bool reconnect; /* set to 1 if automatic reconnect */
struct st_mysql_options options;
char scramble_buff[9];
struct charset_info_st *charset;
unsigned int server_language;
} MYSQL;
MYSQL_RES
Esta estructura representa los resultados de una petición que
devuelve columnas. Los datos devueltos se llaman conjunto de resultados.
typedef struct st_mysql_res {
my_ulonglong row_count;
unsigned int field_count, current_field;
MYSQL_FIELD *fields;
MYSQL_DATA *data;
MYSQL_ROWS *data_cursor;
MEM_ROOT field_alloc;
MYSQL_ROW row; /* If unbuffered read */
MYSQL_ROW current_row; /* buffer to current row */
unsigned long *lengths; /* column lengths of current row */
MYSQL *handle; /* for unbuffered reads */
my_bool eof; /* Used my mysql_fetch_row */
} MYSQL_RES;
MYSQL_ROW
Esta estructura es un tipo libre de representación de datos en una columna. No puedes usarla como una cadena que finaliza con un caracter nulo, porque los datos de esta cadena pueden ser binarios y pueden incluir caracteres nulos.
typedef struct st_mysql_field {
char *name; /* Name of column */
char *table; /* Table of column if column was a field */
char *def; /* Default value (set by mysql_list_fields) */
enum enum_field_types type; /* Type of field. Se mysql_com.h for types */
unsigned int length; /* Width of column */
unsigned int max_length; /* Max width of selected set */
unsigned int flags; /* Div flags */
unsigned int decimals; /* Number of decimals in field */
} MYSQL_FIELD;
my_ulonglong
El tipo usado para el número de columnas y para
mysql_affected_rows(), mysql_num_rows(), y mysql_insert_id().
Este tipo provee un rango de 0 a 1.84e19. En algunos sistemas, al
intentar escribir un valor del tipo my_ulonglong no funcionará.
Para imprimir cada uno de estos valores, conviértelo a unsigned
long y usa el formato %lu de printf. Ejemplo: printf(Number of rows:
%lu\n", (unsigned long) mysql_num_rows(result));
typedef unsigned long my_ulonglong;
Como he dicho antes las bibliotecas de MySQL están en la
biblioteca mysqlclient. Así que cuando compilemos un
programa MySQL es necesario añadir la opción -lmysqlclient
al compilador. Las cabeceras (headers) de MySQL están en
/usr/include/mysql (aunque esto depende de tu distribución
Linux). La cabecera de tu programa tendrá algo parecido a esto:
#include <mysql/mysql.h>
Los tipos de variables y funciones de MySQL están incluidos
en esta cabecera (header).
MYSQL *mysql;
Antes de conectar a una base de datos, debemos llamar a la siguiente
función para inicializar la variable mysql:
mysql_init(MYSQL *mysql)
Entonces la
MYSQL * STDCALL mysql_real_connect(MYSQL *mysql,
const char *host,
const char *user,
const char *passwd,
const char *db,
unsigned int port,
const char *unix_socket,
unsigned int clientflag);
función es llamada para conectar a la base de datos host es el hostname (nombre del sistema) del servidor MySQL. user es el usuario con el cual queremos conectarnos. passwd es la contraseña. db es la base de datos a la que queremos conectarnos, port es el número de puerto TCP/IP del servidor MySQL. unix_socket es el tipo de conexión. clientflag es el flag que hace que MySQL corra como ODBC. En este artículo será 0. Esta función devuelve 0 cuando la conexión se establece.
Ahora podemos conectarnos a una base de datos y hacer una
petición:
char *query;
Usando esta cadena podemos construir cualquier sentencia SQL y hacer
la petición. La función que ejecuta la petición es:
int STDCALL mysql_real_query(MYSQL *mysql,mysql es la variable que hemos usado. q es la cadena de petición SQL. length es la longitud de la cadena. Si la petición se produce sin errores, la función devuelve 0.
const char *q,
unsigned int length);
Después de hacer una petición, necesitamos una variable en MYSQL_RES para poder disponer de los resultados de la petición. La siguiente línea crea esa variable:
MYSQL_RES *res;Entonces
mysql_use_result(MYSQL *query)La función se usa para leer los resultados.
Aunque podemos hacer peticiones fácilmente, necesitamos otras
funciones para usar los resultados. La primera es:
MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);Esta función transforma los resultados en columnas. Como te habrás dado cuenta, la función devuelve una variable del tipo de MYSQL_ROW. La siguiente línea crea dicha variable:
MYSQL_ROW row;Como ya se ha explicado la variable row es un arreglo de cadenas. Esto quiere decir que row[0] es la primera columna de la primera fila y row[1] es la segunda columna de la primera fila. Cuando usamos mysql_fetch_row, la variable toma los datos de la siguiente fila del resultado. Cuando alcanzamos el final del resultado la función devuleve un valor negativo. Al final necesitamos cerrar la conexión:
mysql_close(MYSQL *mysql)
unsigned int STDCALL mysql_num_fields(MYSQL *mysql);Esta función devuelve el número de campos de la tabla.
Para obtener el número de columnas del resultado de una
petición usa:
my_ulonglong STDCALL mysql_num_rows(MYSQL_RES *res);
my_ulonglong STDCALL mysql_affected_rows(MYSQL *mysql);
Esta función se usa para conocer el número de columnas que son afectadas por peticiones de INSERT, DELETE o UPDATE. Nótese que la función devuelve el tipo my_ulonglong.Finalmente algún código de ejemplo:
#include <mysql/mysql.h>
#include <stdio.h>
void main(){
MYSQL *mysql;
MYSQL_RES *res;
MYSQL_ROW row;
char *query;
int t,r;
mysql_init(mysql);
if (!mysql_real_connect(mysql,"localhost","mysql",
"mysql","deneme",0,NULL,0))
{
printf( "Error connectin ot database: %s\n",mysql_error(mysql));
}
else printf("Connected...\n");
query="select * from Deneme";
t=mysql_real_query(mysql,query,(unsigned int) strlen(query));
if (t)
{
printf("Error making query: %s\n",
mysql_error(mysql));
}
else printf("Query made...\n");
res=mysql_use_result(mysql);
for(r=0;r<=mysql_field_count(mysql);r++){
row=mysql_fetch_row(res);
if(row<0) break;
for(t=0;t<mysql_num_fields(res);t++){
printf("%s ",row[t]);
}
printf("\n");
}
mysql_close(mysql);
}
|
Contactar con el equipo de LinuFocus
© Özcan Güngör, FDL LinuxFocus.org |
Información sobre la traducción:
|
2003-12-03, generated by lfparser version 2.41