Hola a todos !!!
Expongo el thread para algunos que se preguntan si existiria alguna API para el trabajo de BD en C del estandar ANSI.
Comento todo el codigo para una mejor comprension del lector. El compilador utilizado es Dev-c++.
Con la inclusion de la lib windows.h ya pierde portablidad, pero la incluyo porque MySQL.h hace llamadas a sockets o sea winSock.h para poder establecer conexiones externas (ambiente Inet Global) y locales, la ventaja es que MySQL.h tambien esta para sistemas codigo abierto como Linux y Unix, pero en vez de windows.h habria que incluir otras librerias.
Nota: Algunas funciones no las comento, porque casi hacen las mismas llamadas y creo que entenderian el por que, pero si tienen alguna duda no olviden postear y claro cirtiquen el codigo falta optimizacion, aa se me olvido hacer la estrcutura de mi codigo con retornos para mayor optimizacion pero bueno algo es algo xD.
Salvedad: Doy por savido que los que lean este post es porque tienen conocimientos basicos de C y conocen bien los punteros a punteros y han trabajado con MySQL.
Antes de leer el codigo vean esto:
(MYSQL_RES *) es un identificador o variable que puede contener filas de un determinado campo en nuestra BD para poder luego consultar este.
(MYSQL_ROW) es tipo puntero a puntero aunque no se haga uso de * pero si vemos como consultamos sus datos nos daremos cuenta, este acepta valores o elementos que se encuentran en "MYSQL_RES *" o sea lo que recojimos con "MYSQL_RES *" esta variable los puede manejar sin problemas.
(MYSQL *) este acepta elementos o valores de un retorno a una variable del mismo tipo para luego enviar y recibir datos, o sea es quien nos envia, devuelve, conecta y desconecta del servidor MySQL.
#include <stdio.h>
#include <windows.h>
#include <mysql/mysql.h>
//prototipos de funciones
void mostrar(MYSQL *con, MYSQL_ROW row, MYSQL_RES *resultado, char *consulta);
void insertar(MYSQL *con, char *nombre, int id);
void borrar(MYSQL *con, MYSQL_RES *res, MYSQL_ROW row, int id);
void update(MYSQL *con);
void buscar(MYSQL *con, MYSQL_RES *res, MYSQL_ROW row, int id);
//cuerpo de funciones
void mostrar(MYSQL *con, MYSQL_ROW row, MYSQL_RES *resultado, char *consulta)
{
//concatena las constantes a la variable consulta
sprintf(consulta
, "select * from amigo;"); //hacemos consulta y verificamos que se cumple
if((mysql_query(con, consulta)==0))
{
//guardamos resultado en la variable resultado que es de tipo MYSQL_RES *
resultado=mysql_use_result(con);
//leemos los datos almacenados en resultadoy lo devolvemos a la variable row que es de tipo MYSQL_ROW
while(row=mysql_fetch_row(resultado))
{
printf("%s---%s\n", row
[0], row
[1]); }
}
//preguntamos si se ha llegado al final de nuestra variable resultado
if(!mysql_eof(resultado))
{
printf("Error de lectura %s\n", mysql_error
(con
)); }
//cerramos conexion ya establecida
//mysql_close(con);
}
void insertar(MYSQL *con, char *nombre, int id)
{
char consulta[50];
sprintf(consulta
, "INSERT INTO amigo VALUES('%s', '%i');", nombre
, id
);
if((mysql_query(con, consulta)==0))
{
printf("Se agrego la nueva persona a la BD\n"); }
else
{
printf("Error no se pudo crear la nueva persona %s \n", mysql_error
(con
)); }
}
void borrar(MYSQL *con, MYSQL_RES *resultado, MYSQL_ROW row, int id)
{
char consulta[50];
sprintf(consulta
, "DELETE FROM amigo WHERE id='%i';", id
);
if(mysql_query(con, consulta)==0)
{
printf("Se elimino persona correctamente de la BD\n"); }
}
void update(MYSQL *con)
{
char nombre[10], consulta[50];
int op, id;
printf("Que deseas modificar\n\n1:Nombre\n2:id\nOpcion: ");
if(op==1)
{
printf("Inserta el ID de la persona a eliminar: "); printf("Inserte Nuevo Nombre: "); sprintf(consulta
, "UPDATE amigo SET nombre='%s' WHERE id='%d';", nombre
, id
); }
else
{
printf("Inserte Nombre de la persona a elimininar: "); sprintf(consulta
, "UPDATE amigo SET id='%i' WHERE nombre='%s';", id
, nombre
); }
if(mysql_query(con, consulta)==0)
{
printf("Se guardaron los datos correctamente"); }
}
void buscar(MYSQL *con, MYSQL_RES *res, MYSQL_ROW row, int id)
{
char consulta[50];
sprintf(consulta
, "SELECT nombre, id FROM amigo WHERE id='%i';", id
);
if(mysql_query(con, consulta)==0)
{
printf("Los datos se buscaron correctamente\n\n");
res=mysql_use_result(con);
while(row=mysql_fetch_row(res))
{
printf("%s %s", row
[0], row
[1]); }
}
}
int main()
{
MYSQL *con;
MYSQL_RES *resultado;
MYSQL_ROW row;
char consulta[1024], nombre[25];
int id;
int op;
//inicializamos conexion SQL a algun atributo en este caso NULL.
con = mysql_init(NULL);
//establecemos conexion SQL y comprobamos que funciona
if(!mysql_real_connect(con, "localhost", "root", NULL, "prueba", 3306, NULL, 0))
{
printf("Error conectando con BD Prueba %s\n", mysql_error
(con
)); }
printf("Que quieres hacer\n\n1:Leer BD\n2:Insertar Datos\n3:Eliminar Datos\n4:Actualizar Datos\n5:Buscar Datos\n\nEliga Opcion: ");
switch(op)
{
case 1:
mostrar(con, row, resultado, consulta);
return main();
//break;
case 2:
printf("Introduzca Nombre de persona: "); insertar(con, nombre, id);
return main();
//break;
case 3:
printf("Inserte el ID de persona: "); borrar(con, resultado, row, id);
return main();
//break;
case 4:
update(con);
return main();
//break;
case 5:
printf("Inserte ID de persona a Buscar: "); buscar(con, resultado, row, id);
return main();
default:
printf("Error no existe opcion\n\n"); break;
}
//cerramos conexion SQL
mysql_close(con);
}