martes, 20 de octubre de 2020

Tutorial de programación de Free Pascal + MySQL/MariaDB Tercera parte

Bienvenidos a una nueva entrega del tutorial de Free Pascal y MySQL/MariaDB!

  

Antes de continuar considero pertinente hacer el comentario de que no soy un experto en la materia, ni en Free Pascal mucho menos en MySQL/MariaDB. Simplemente soy un aficionado a Pascal que ha ido encontrando la manera de seguir usando ese lenguaje de manera práctica para su trabajo personal. Hay muchos temas que quedan fuera de este tutorial porque en verdad no las sé! Claves foreing, Primary Keys y cosas así de MySQL/MariaDB, espero en un futuro poder entender y explicar esos conceptos.

En fin, a lo que vinimos.

En la primera parte del tutorial preparamos la conexión en el esqueleto de Free Pascal; en la segunda parte hicimos nuestra primer consulta obteniendo un resultado. Para este tutorial vamos a aprender a insertar un dato.

En el tutorial anterior creamos nuestra base de datos, nuestra tabla y nuestros campos, a los cuales insertamos sus primeros datos manualmente. Al no usar especificaciones a la hora de crear la tabla, necesitamos definir manualmente todos y cada uno de los campos, pero cuidado, pues podemos duplicar sin que MySQL/MariaDB nos avise, cubriremos esta situación posteriormente, por ahora lo importante es que tengan la estructura funcional.

Continuaremos con el esqueleto del tutorial anterior y seguiremos una línea antes del End final.

Añadiremos las líneas necesarias para imprimir y leer la información que vamos a insertar, previamente necesitamos declarar las variables donde almacenaremos la información que nos proporcione el usuario:
id, nombre, edad y correo de tipo String
total_registros, contador de tipo Integer

Una vez definidas, recibimos los datos del usuario:

Write('id: ');Readln(id);
Write('Nombre: ');Readln(nombre);
Write('Edad: ');Readln(edad);
Write('Correo: ');Readln(correo);


Con los datos en las variables, preparamos la consulta de MySQL/MariaDB:
texto_consulta := 'INSERT INTO datos(id, nombre, edad, correo) VALUES ('+ #39 + id + #39 + #44 + #39 + nombre + #39 + #44 + #39 + edad + #39 + #44 + #39 + correo + #39')' + #0;


(Nota del editor: fue la primer forma que encontré para darle formato a la consulta, ya que MySQL/MariaDB usa las comillas simples ' y Free Pascal las interpreta como cierre de cadena; #39 corresponde a la comilla simple ', #44 corresponde a la coma .)

Ejecutamos la consulta:
consulta := @texto_consulta[1];
mysql_query(socket, consulta);


Y listo! Los datos han sido insertados en la base de datos!

Ahora bien, para corroborar preparamos la cadena para consultar todos los datos:
texto_consulta := 'SELECT * from datos' +#0;


Ejecutamos la consulta:
consulta := @texto_consulta[1];
mysql_query(socket,consulta);


Almacenamos los resultados
bufer_respuesta := mysql_store_result(socket);


Leemos el total de registros
total_registros := mysql_num_rows(bufer_respuesta);


Creamos un ciclo for para leer cada uno de los resultados e imprimirlos:
For contador := 1 to total_registros do
Begin
fila_bufer := mysql_fetch_row(bufer_respuesta);
Writeln('ID: ', fila_bufer[0],' - Nombre: ', fila_bufer[1], ' - Edad: ', fila_bufer[2],' - Correo: ',fila_bufer[3]);
mysql_free_result(bufer_respuesta);
End;

 

Cerramos la conexión (por cierto, olvidé cerrar las conexiones en los tutoriales pasados).

mysql_close(socket);



Y terminamos, de esta manera nos debe listar todos los elementos que tenemos en la tabla.

Enlaces para mis tutoriales anteriores 1ra parte 2da parte


Como es costumbre, dejo el código completo para su análisis:

Program tutorial03;
{$codepage UTF8}
{$mode objfpc}{$H+}

Uses
    Crt, MySQL4;

Var
    servidor, usuario, contrasena, basededatos : String;
    alloc,socket : PMYSQL;
     qmysql : TMYSQL;
     texto_consulta : String;
     consulta : PChar;
     bufer_respuesta : PMYSQL_RES;
     fila_bufer : MYSQL_ROW;
     id, nombre, edad, correo : String;
     contador, total_registros : Integer;

Begin
     ClrScr;
     Write('Servidor: ');
     Readln(servidor);
     Write('Usuario: ');
     Readln(usuario);
     Write('Contraseña: ');
     Readln(contrasena);
     Write('Base de Datos: ');
     Readln(basededatos);
     alloc := mysql_init(PMYSQL(@qmysql));
     socket := mysql_real_connect(alloc, PChar(servidor), PChar(usuario),     PChar(contrasena), PChar(basededatos), 0, nil, 0);
    If socket=Nil then
    begin
        Writeln (stderr,'Couldn''t connect to MySQL.');
        Writeln (stderr, 'Error was: ', mysql_error(@qmysql));
         halt(1);
    end;
     Writeln;
     texto_consulta := 'SELECT * from datos' +#0;
     consulta := @texto_consulta[1];
     mysql_query(socket,consulta);
     bufer_respuesta := mysql_store_result(socket);
     fila_bufer := mysql_fetch_row(bufer_respuesta);
     Writeln('ID: ', fila_bufer[0],' - Nombre: ', fila_bufer[1], ' - Edad: ', fila_bufer[2],' - Correo: ',fila_bufer[3]);
     mysql_free_result(bufer_respuesta);
     Writeln;
     Write('id: ');Readln(id);
     Write('Nombre: ');Readln(nombre);
     Write('Edad: ');Readln(edad);
     Write('Correo: ');Readln(correo);
     texto_consulta := 'INSERT INTO datos(id, nombre, edad, correo) VALUES ('+ #39 + id + #39 + #44 + #39 + nombre + #39 + #44 + #39 + edad + #39 + #44 + #39 + correo + #39')' + #0;
    consulta := @texto_consulta[1];
     mysql_query(socket, consulta);
     Writeln;
     texto_consulta := 'SELECT * from datos' +#0;
     consulta := @texto_consulta[1];
     mysql_query(socket,consulta);
     bufer_respuesta := mysql_store_result(socket);
     total_registros := mysql_num_rows(bufer_respuesta);
     For contador := 1 to total_registros do
     Begin
         fila_bufer := mysql_fetch_row(bufer_respuesta);
         Writeln('ID: ', fila_bufer[0],' - Nombre: ', fila_bufer[1], ' - Edad: ', fila_bufer[2],' -     Correo: ',fila_bufer[3]);
        mysql_free_result(bufer_respuesta);
     End;
     mysql_close(socket);
End.