Base de Datos con MySQL desde C !Excelente!

Iniciado por Fire544, 10 Julio 2012, 20:56 PM

0 Miembros y 1 Visitante están viendo este tema.

Fire544

Hola a todos !!!  :xD 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);
                       
                        printf("Usuario    ID\n\n");
                        //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);
                                           
                                           fflush(stdin);
                                           getchar();
                                           
                                           system("cls");
   
    }

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");
                         fflush(stdin);
                         getchar();
                         }
                         else
                         {
                             printf("Error no se pudo crear la nueva persona %s \n", mysql_error(con));
                             }
    system("cls");
    }
   
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");
                     fflush(stdin);
                     getchar();
                     }

    system("cls");
    }

void update(MYSQL *con)
{
    char nombre[10], consulta[50];
    int op, id;
   
    printf("Que deseas modificar\n\n1:Nombre\n2:id\nOpcion: ");
    scanf("%i", &op);
   
    if(op==1)
    {
             printf("Inserta el ID de la persona a eliminar: ");
             scanf("%i", &id);
             printf("Inserte Nuevo Nombre: ");
             fflush(stdin);
             gets(nombre);
             printf("\n");
             sprintf(consulta, "UPDATE amigo SET nombre='%s' WHERE id='%d';", nombre, id);
             }
    else
    {
        printf("Inserte Nombre de la persona a elimininar: ");
        fflush(stdin);
        gets(nombre);
        printf("Inserte nuevo ID ");
        scanf("%i", &id);
        sprintf(consulta, "UPDATE amigo SET id='%i' WHERE nombre='%s';", id, nombre);
        }
       
    if(mysql_query(con, consulta)==0)
    {
                         printf("Se guardaron los datos correctamente");
                         getchar();
                         system("cls");
                         }
    }

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");
                        fflush(stdin);
                       
                        res=mysql_use_result(con);
                       
                        printf("Nombre      ID User\n\n");
                       
                        while(row=mysql_fetch_row(res))
                        {
                                                       printf("%s      %s", row[0], row[1]);
                                                       }
                        }
                       
                        getchar();
                        system("cls");
    }

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: ");
 
   scanf("%d", &op);
   
   switch(op)
   {
   case 1:
   system("cls");
   mostrar(con, row, resultado, consulta);
   return main();
   //break;
   
   case 2:
        system("cls");
        printf("Introduzca Nombre de persona: ");
        fflush(stdin);
        gets(nombre);
        printf("\n");
        printf("ID de persona: ");
        scanf("%i", &id);
        insertar(con, nombre, id);
        return main();
        //break;
       
  case 3:
       system("cls");
       printf("Inserte el ID de persona: ");
       fflush(stdin);
       scanf("%i", &id);
       borrar(con, resultado, row, id);  
       return main();    
       //break;
   
   case 4:
        system("cls");
        update(con);
        return main();
        //break;
   
   case 5:
        system("cls");
        printf("Inserte ID de persona a Buscar: ");
        scanf("%i", &id);
        system("cls");
        buscar(con, resultado, row, id);  
        return main();
               
   default:
           printf("Error no existe opcion\n\n");
           getchar();
           break;    
   }
   //cerramos conexion SQL
   mysql_close(con);
   getchar();
   }
"Si enseñas a pezcar a un niño lo ayudas para toda la vida, si pezcas para alimentarlo lo ayudas por un momento".

fabianjsm

Muy buen aporte!

Solo realizar esta aclaración: Dev-c++ no es un compilador, es un IDE, probablemente estes compilando con MinGW (podrías estar utilizando otro port como djgpp, o gcc sobre Linux, pero no lo creo en principio por el include <windows.h>... sin entrar en detalles, la explicación de porque la incluyes tampoco es correcta). Del sitio oficial: Bloodshed Dev-C++ is a full-featured Integrated Development Environment (IDE) for the C/C++ programming language.

Fire544

Cita de: fabianjsm en 26 Agosto 2012, 23:16 PM
Muy buen aporte!

Solo realizar esta aclaración: Dev-c++ no es un compilador, es un IDE, probablemente estes compilando con MinGW (podrías estar utilizando otro port como djgpp, o gcc sobre Linux, pero no lo creo en principio por el include <windows.h>... sin entrar en detalles, la explicación de porque la incluyes tampoco es correcta). Del sitio oficial: Bloodshed Dev-C++ is a full-featured Integrated Development Environment (IDE) for the C/C++ programming language.

La explicacion de porque la incluyo no es completa pero si correcta, entonces como ara las llamadas a winsock ? entiendo lo que quieres dejar dicho, pero Si claro Dev-c++ es un IDE Entorno de desarrollo eso esta claro, y claro que compila con GCC !!
"Si enseñas a pezcar a un niño lo ayudas para toda la vida, si pezcas para alimentarlo lo ayudas por un momento".

fabianjsm

Para utilizar una librería, no debes incluir todos los archivos de cabecera de las funciones que esta requiere internamente. No estas incluyendo windows.h para abrir sockets porque no los estas utilizando, no porque haya leído todo tu código fuente, sino porque asumo que lo has compilado antes de subir, el código compila correctamente, sino no lo subirías. Lo compilaste en Windows, por eso el include <windows.h>. Si estuvieras utilizando sockets en Windows deberías haber incluido el archivo de cabeceras para trabajar con ellos: winsock.h.

Probablemente sin "windows.h" no puedas compilar, pero lo aconsejable para compilar un cliente MySQL en Windows es que incluyas my_global.h, no windows.h directamente. http://dev.mysql.com/doc/refman/5.0/es/windows-client-compiling.html

BlackZeroX

mmm veo que usas fflush(stdin); no creo que sea stdin por el contexto del codigo, mas bien es stdout fflush(stdout);

Dulces Lunas!¡.
The Dark Shadow is my passion.

flony

hace rato estaba buscando algo que me sirva de base para mi base de dato...me gustaría hacerlo pero en c++
si un problema no tiene solucion entonces no es un problema...es algo inevitable

Fire544

Cita de: fabianjsm en 27 Agosto 2012, 01:49 AM
Para utilizar una librería, no debes incluir todos los archivos de cabecera de las funciones que esta requiere internamente. No estas incluyendo windows.h para abrir sockets porque no los estas utilizando, no porque haya leído todo tu código fuente, sino porque asumo que lo has compilado antes de subir, el código compila correctamente, sino no lo subirías. Lo compilaste en Windows, por eso el include <windows.h>. Si estuvieras utilizando sockets en Windows deberías haber incluido el archivo de cabeceras para trabajar con ellos: winsock.h.

Probablemente sin "windows.h" no puedas compilar, pero lo aconsejable para compilar un cliente MySQL en Windows es que incluyas my_global.h, no windows.h directamente. http://dev.mysql.com/doc/refman/5.0/es/windows-client-compiling.html

Hey BlackZeroX (Astaroth) tienes mucha razon, si claro utilizo la libreria windows.h por el hecho de compilar en windows, lo que pasa es que windows.h hace llamadas a my_global.h muy buena la aclaracion, gracias BlackZeroX (Astaroth) !!  ;-)
"Si enseñas a pezcar a un niño lo ayudas para toda la vida, si pezcas para alimentarlo lo ayudas por un momento".