Difference between revisions of "Lazarus Database Tutorial/es"

From Lazarus wiki
Jump to navigationJump to search
Line 320: Line 320:
 
Para cambiar contenido de la base de datos realizo la llamada al motor de la base de datos (DB Engine) mediante las siguientes sentencias de código:
 
Para cambiar contenido de la base de datos realizo la llamada al motor de la base de datos (DB Engine) mediante las siguientes sentencias de código:
  
<delphi>
+
<delphi> try
  try
 
 
     sql:= 'UPDATE table SET setting=1';
 
     sql:= 'UPDATE table SET setting=1';
 
     PQDataBase.Connected:=True;
 
     PQDataBase.Connected:=True;
Line 333: Line 332:
 
     on E : Exception do
 
     on E : Exception do
 
       MemoLog.Append('ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message);
 
       MemoLog.Append('ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message);
   end;
+
   end;</delphi>
</delphi>
 
  
 
* Notas:
 
* Notas:

Revision as of 23:45, 1 June 2009

Deutsch (de) English (en) español (es) français (fr) Bahasa Indonesia (id) italiano (it) 日本語 (ja) Nederlands (nl) português (pt) русский (ru) 中文(中国大陆)‎ (zh_CN) 中文(台灣)‎ (zh_TW)

Introducción

Este documento explica cómo hacer trabajar a Lazarus con una variedad de bases de datos.

Por favor, expandir esta sección.

Lazarus y MySQL

by ChrisKirk

  1. Poner a trabajar MySQL en Linux o Windows, en modo consola.
  2. Poner a trabajar MySQL con FPC en modo texto.
  3. Poner a trabajar MySQL en un formulario Lazarus.
  4. Descargue el Código fuente de ejemplo de MySQL

1 - Poner a trabajar MySQL en Linux o Windows

Siga las instrucciones del Manual del Usuario de MySQL. Asegúrese que el demonio mysqld esté corriendo adecuadamente, y que todos los potenciales usuarios (incluyendo a root, mysql, usted mismo y cualquier otro que lo necesite) tengan tantos privilegios como requieran, desde la cantidad de hosts que sean necesarios (incluyendo a 'localhost', el nombre de la misma máquina y de las otras integrantes de su red) hasta el grado de seguridad que se requiera. Es recomendable que todos los usuarios, incluyendo a root, tengan contraseña. Pruebe el funcionamiento del sistema de base de datos usando los ejemplos dados en el manual y verifique que todos los usuarios posean acceso a la misma.

2 - Poniendo a trabajar MySQL con FPC en modo texto

Hay un directorio con un ejemplo en $(FreePascal_directory)/packages/base/mysql/, este directorio también contiene las unidades mysql.pp, mysql_com.pp y mysql_version.pp. Antes de correr los scripts de testeo debe crear la base de datos llamada testdb: Hágalo conectándose en la consola de mysql (como root con privilegios totales) y escriba la siguiente sentencia SQL

 CREATE DATABASE testdb;

asegúrese que todos los usuarios que lo necesiten tengan el apropiado privilegio de acceso a ésta base.

 GRANT ALL ON testdb TO johnny-user IDENTIFIED BY 'johnnyspassword'; 

Hay un script llamado mkdb que debería tratar de correr:

 sh ./mkdb

Ésto probablemente fallará, debido a que el sistema no debería permitir a un usuario anónimo acceder a la base de datos. Por consiguiente modifique el script utilizando un editor para que la línea que invoca a mysql diga:

 mysql -u root -p  ${1-testdb} << EOF >/dev/null

pruebe correrlo nuevamente, ingresando su contraseña cuando se la pida. Con suerte Ud. ya habría creado la base de datos de prueba, verifíquelo (conectado a la consola de mysql) escribiendo la siguiente sentencia

 select * from FPdev;

Debería ver la tabla listando el ID, nombre y dirección de email de algunos de los desarrolladores de FPC.

Ahora trate de correr el programa de testeo testdb.pp (puede ser necesario compilarlo y ¡seguramente fallará en el primer intento!).

He encontrado que el programa no puede conectarse a mysql por diversas razones:

  • Mi sistema (SuSE Linux v9.0) instala mysql v4.0.15, no la versión 3 para la cual fue diseñado el programa.
  • El programa necesita tener nombres de usuarios y contraseñas para acceder a la base de datos.
  • El compilador necesita saber dónde encontrar las bibliotecas mysql ( SI AÚN NO HA INSTALADO LAS BIBLIOTECAS DE DESARROLLO DE MYSQL, ¡HÁGALO AHORA!)

Generé una copia de testdb.pp llamada trydb.pp, en lugar de modificar el original (ésto significa que el archivo original se actualizará automáticamente en las siguientes actualizacione por CVS). También copié los archivos encontrados en el subdirectorio mysql/ver40/ en el subdirectorio principal mysql/ , renombrandolos mysql_v4.pp, mysql_com_v4.pp y mysql_version_v4.pp, asegúrese de renombrar las unidades dentro de cada archivo según corresponda. Modifique la sentencia uses en trydb.pp a

<delphi> uses mysql_v4</delphi>

y la sentencia en mysql_v4.pp a

<delphi> uses mysql_com_v4</delphi>

Agregué una línea a /etc/fpc.cfg que apunta a mis bibliotecas:

 -Fl/lib;/usr/lib

y en /usr/lib debo encontrar el nombre real de la biblioteca mysqlclient. En mi caso utilicé la línea de comandos:

 ln -s libmysqlclient.so.12.0.0 lmysqlclient

para crear un enlace simbólico permitiendo a FPC encontrar la biblioteca. Como buena media también creé el link

 ln -s libmysqlclient.so.12.0.0 mysqlclient

y ubiqué varios enlaces similares en otros directorios: no son estrictamente necesarios, ¡pero por si acaso!. Parece que algunos usuarios necesitan agregar tembién el siguiente link:

 ln -s libmysqlclient.so.12.0.0 libmysqlclient.so

Modifiqué trydb.pp para incluir el detalle del usuario, inicialmente agregando el host, usuario y contraseña como constantes:

<delphi> const

 host : Pchar= 'localhost';
 user : Pchar= 'myusername';
 passwd: Pchar = 'mypassword';</delphi> 

También me encontré que no podía conectarme a mysql usando la llamada mysql_connect(), la cual tiene muchos más parámetros. Para complicar las cosas aún más, el número de parámetros parece haber cambiado entre la versión 3 (donde son siete) y la versión 4 (donde son ocho). Antes de usar mysql_real_connect tengo que usar mysql_init() la cual no se encuentra en el archivo original mysql.pp, pero si está en mysql_v4.pp.

Por lo tanto, el código para la conexión a la base de datos ahora es: <delphi> { a few extra variables}

 var
   alloc : PMYSQL;
 {main program fragment} 
 begin
 if paramcount=1 then
 begin
   Dummy:=Paramstr(1)+#0;
   DataBase:=@Dummy[1];
 end; 
 Writeln ('Allocating Space...');
 alloc := mysql_init(PMYSQL(@qmysql));
 Write ('Connecting to MySQL...');
 sock :=  mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);
 if sock=Nil then
 begin
   Writeln (stderr,'Couldnt connect to MySQL.');
   Writeln (stderr, 'Error was: ', mysql_error(@qmysql));
   halt(1);
 end;
 Writeln ('Done.');
 Writeln ('Connection data:');
 {$ifdef Unix}
 writeln ('Mysql_port      : ',mysql_port);
 writeln ('Mysql_unix_port : ',mysql_unix_port);
 {$endif}
 writeln ('Host info       : ',mysql_get_host_info(sock));
 writeln ('Server info     : ',mysql_stat(sock));
 writeln ('Client info     : ',mysql_get_client_info); 
 Writeln ('Selecting Database ',DataBase,'...');
 if mysql_select_db(sock,DataBase) < 0 then
 begin
   Writeln (stderr,'Couldnt select database ',Database);
   Writeln (stderr,mysql_error(sock));
   halt (1);
 end;
 {... as original contents of testdb.pp}</delphi>

Ahora, ¿preparado para comenzar a compilar trydb.pp?

fpc trydb

¡éxito! Ahora lo ejecutamos:

./trydb

¡Epaaa! ¡Ya tengo la lista de desarrolladores de FPC!

Unos cuantos refinamientos extras: haga interactivos la entrada del nombre de usuario y de los comandos a la base de datos, usando variables en vez de constantes y permita varias sentencias SQL usuarios, vea el código fuente del programa donde el usuario es ingresado desde la consola, y el programa entra en un ciclo donde se aceptan comandos SQL (sin el punto y coma final) y se visualizan las respuestas, hasta que se ingresa la palabra 'quit'.

Vea un ejemplo de salida

3 - Conectando a MySQL desde una Aplicación Lazarus

Este documento muestra cómo conectar Lazarus a la base de datos MySQL, y ejecutar consultas simples, usando sólo los componentes básicos de Lazarus; no utiliza componentes conectados a datos, pero ilustra los principios de interacturar con la base de datos.

Cree un nuevo proyecto en Lazarus:

Project -> New Project -> Application

Automáticamente aparecerá un nuevo Form.

Aumente el tamaño del form hasta la mitad de la pantalla, lugo renómbre el formulario y su título como 'TryMySQL'.

Desde la pestaña de Componentes Standard ubique tres controles de edición en el lado superior izquierdo e inmediatamente arriba de cada control ubique una etiqueta. Cambie los nombres y los títulos a 'Host' (y HostLabel, HostEdit), 'UserName' (and UserLabel, UserEdit) y 'Password' (con PasswdLabel y PasswdEdit). Como alternativa podría haber utilizado el componente LabelledEdit desde la pestaña Adicionales.

Seleccione el cuadro de edición Passwd y busque la propiedad PasswordChar: cambiela a * o algún otro caracter, para que cuando ingrese la contraseña no aparezcan los caracteres en su pantalla y sólo se muestren una serie de *. Asegúrese que la propiedad Texto de cada cuadro de edición está en blanco.

Ahora ubique otra caja de edición y una etiqueta en el extremo superior derecho de su formulario. Cambie la etiqueta a 'Ingrese el comando SQL' y nómbrelo como CommandEdit.

Ubique tres botones en el formulario: dos en la parte izquierda, bajos los cuadros de edición y uno a la derecha bajo el cuadro de comando.

Nombre los botones en la izquierda como 'Conectar a la base de datos' (ConnectButton) y 'Salir' (ExitButton) y al de la derecha como 'Enviar consulta' (QueryButton).

Ubique un campo memo largo etiquetado 'Resultado' (ResultMemo) en la parte inferior derecha que cubra la mayor parte del espacio. Busque su propiedad ScrollBars y seleccione ssAutoBoth, para que ambas barras aparezcan automáticamente si el texto llena el espacio. Marque la propiedad WordWrap como Verdadera.

Inserte una barra de estado (desde la pestaña Common Controls) en el fondo del formulario y ponga en la propiedad SimpleText 'TryMySQL'.

Una captura de pantalla del formulario puede ser vista en: Ejemplo de pantalla Mysql

Ahora necesitamos escribir el código para manejar las acciones.

Los tres cuadros de edición de la izquierda son para el ingreso del nombre del host, usuario y contraseña. Cuando éstos han sido completados satisfactoriamente, se debe hacer click en el botón Connect. El manejador del evento OnClick está basado en parte del programa en modo texto del FPC que describimos antes.

Las respuestas desde la base de datos no pueden ser visualizadas usando las sentencias de Pascal write o writeln: en lugar de eso deben ser convertidas en strings y mostradas en el campo memo. Mientras que las sentencias write y writeln de Pascal son capaces de una conversión de tipos "al vuelo", el uso de un campo memo para visualizar la salida de texto necesita la explícita conversión de los tipos de datos al formato string, por ende las variables Pchar deben ser convertidas a string usando StrPass y los enteros se convierten con IntToStr.

Las strings son mostradas en el campo Memo usando

<delphi> procedure ShowString (S : string);

 (* display a string in a Memo box *)
 begin
 |trymysqlForm1.ResultsMemo.Lines.Add (S)
 end;</delphi>

El evento en el botón ConnectButton queda como:

<delphi> procedure TtrymysqlForm1.ConnectButtonClick(Sender: TObject);

 (* Connect to MySQL using user data from Text entry boxes on Main Form *)
 var strg: string;
 begin
   dummy1 :=  trymysqlForm1.HostEdit.text+#0;
   host := @dummy1[1];
   dummy2 := trymysqlForm1.UserEdit.text+#0;
   user := @dummy2[1] ;
   dummy3 := trymysqlForm1.PasswdEdit.text+#0;
   passwd := @dummy3[1] ;
alloc := mysql_init(PMYSQL(@qmysql)); sock := mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0); if sock=Nil then begin strg :='Couldnt connect to MySQL.'; showstring (strg); Strg :='Error was: '+ StrPas(mysql_error(@qmysql)); showstring (strg); end else begin trymysqlForm1.statusBar1.simpletext := 'Connected to MySQL'; strg := 'Now choosing database : ' + database; showstring (strg); {$ifdef Unix} strg :='Mysql_port : '+ IntToStr(mysql_port); showstring (strg); strg :='Mysql_unix_port : ' + StrPas(mysql_unix_port); showstring (strg); {$endif} Strg :='Host info : ' + StrPas(mysql_get_host_info(sock)); showstring (strg); Strg :='Server info : ' + StrPas(mysql_stat(sock)); showstring (strg); Strg :='Client info : ' + Strpas(mysql_get_client_info); showstring (strg); trymysqlForm1.statusbar1.simpletext := 'Selecting Database ' + DataBase +'...'; if mysql_select_db(sock,DataBase) < 0 then begin strg :='Couldnt select database '+ Database; ShowString (strg); Strg := mysql_error(sock); ShowString (strg); end end; end;</delphi>

El campo texto en la derecha permite el ingreso de una sentencia SQL, sin el punto y coma final, cuando ud. ya ha completado la misma, el botón SendQuery es presionado y la sentencia es ejecutada, con los resultados devueltos dentro del cuadro ResultsMemo.

El manejador del evento SendQuery es basado también en la versión de texto de FPC, con la salvedad que se deben convertir explícitamente los tipos de datos a formato string antes que sean visualizados en el cuadro.

Una diferencia respecto del programa FPC modo texto es que, si ocurre un error en la sentencia, el programa no se detiene y no se cierra la conexión a MySQL, en lugar de eso, el control es devuelto al formulario principal y se da la oportunidad de corregir la misma antes de reenviar la sentencia. La aplicación finaliza (con el cierre de la conexión a MySQL) cuando se hace click en el botón Exit.

El código para SendQuery es:

<delphi> procedure TtrymysqlForm1.QueryButtonClick(Sender: TObject);

 var
   dumquery, strg: string;
 begin
    dumquery := TrymysqlForm1.CommandEdit.text;
    dumquery := dumquery+#0;
    query := @dumquery[1];
    trymysqlForm1.statusbar1.simpletext := 'Executing query : '+ dumQuery +'...';
    strg := 'Executing query : ' + dumQuery; showstring (strg);
    if (mysql_query(sock,Query) < 0) then
    begin
      Strg :='Query failed '+ StrPas(mysql_error(sock)); showstring (strg);
    end
    else
    begin
      recbuf := mysql_store_result(sock);
      if RecBuf=Nil then
      begin
        Strg :='Query returned nil result.'; showstring (strg);
      end
      else
      begin
        strg :='Number of records returned  : ' + IntToStr(mysql_num_rows (recbuf));
        Showstring (strg);
        Strg :='Number of fields per record : ' + IntToStr(mysql_num_fields(recbuf));
        showstring (strg);
        rowbuf := mysql_fetch_row(recbuf);
        while (rowbuf <>nil) do
        begin
          Strg :='(Id: '+ rowbuf[0]+', Name: ' + rowbuf[1]+ ', Email : ' + rowbuf[2] +')';
          showstring (strg);
          rowbuf := mysql_fetch_row(recbuf);
        end;
      end;
    end;
 end;</delphi>

Guarde su Proyecto y presione Run -> Run

El código completo del programa está disponible en Código fuente del ejemplo

by ChrisKirk

Lazarus y PostgreSQL

Este es un tutorial muy corto que explica como conectar mediante Lazarus (0.9.12>) con el gestor de base de datos PostgreSQL, tanto en conexión local como remota, utilizando TPQconnection.

Después de una correcta instalación tanto de Lazarus como de PostgreSQL, debemos seguir los siguientes pasos:

1.- Situar en el formulario los siguientes componentes:

COMPONENTE / UBICACION EN EL IDE

  • PQConnection ---------> SQLdb
  • SQLQuery ---------------> SQLdb
  • SQLTransaction -------> SQLdb
  • DataSource ----------> DataAccess
  • DBGrid ----------------> DataControls

2.- En el inspector de objetos una vez seleccionado en el formulario PQConnection rellenar los valores de las siguientes propiedades:

  • "transaction": objeto SQLTransaction.
  • "Database name": nombre de la base de datos.
  • "HostName": nombre de equipo que contiene el gestor de la base de datos que conecta a la base de datos.
  • "UserName": login de usuario con acceso a dicha base de datos.
  • "password": contrasena de acceso a la base de datos para el Username.

3.- Comprobar que SQLTransaction ha cambiado automáticamente para apuntar a PQConnection.

4.- En SQLQuery rellenar lo siguiente:

  • "transaction": con su respectivo objeto.
  • "database": con su respectivo objeto.
  • "SQL" : debemos rellenarlo con la consulta SQL que deseamos realizar (algo así como 'select * from anytable')

5.- En el objeto DataSource rellenar:

  • "DataSet": objeto SQLQuery.

6.- En el componente DBGrid rellenar:

  • "DataSource": objeto DataSource.

7.- Modificar todo para que figure como conectado (connected) y activo (active)

  • TDBText y TDBEdit parecen funcionar pero (al menos para mí) solamente muestra datos en la grid.

Para cambiar contenido de la base de datos realizo la llamada al motor de la base de datos (DB Engine) mediante las siguientes sentencias de código:

<delphi> try

   sql:= 'UPDATE table SET setting=1';
   PQDataBase.Connected:=True;
   PQDataBase.ExecuteDirect('Begin Work;');
   PQDataBase.ExecuteDirect(sql);
   PQDataBase.ExecuteDirect('Commit Work;');
   PQDataBase.Connected:=False;
 except
   on E : EDatabaseError do
     MemoLog.Append('DB ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message);
   on E : Exception do
     MemoLog.Append('ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message);
 end;</delphi>
  • Notas:
    • Testeado en windows, Lazarus 0.9.12 + PgSQL 8.3.1
    • Algunos test realizados en linux, Lazarus 0.9.12 and PgSQL 8.0.x.
  • Instalación y errores:
    • En los test realizados con la version 0.9.12 de Lazarus, presentan errores los campos de tipo "text" y "numeric".
    • Se usan sin problemas los tipos char de tamaño fijo, los int y float8.
    • Algunas veces con tan solo reiniciar Lazarus se resuelven algunos errores estúpidos.
    • Después de suceder algunos errores, las transacciones permanecen activas y deben desactivarse manualmente.
    • Los cambios realizados en Lazarus por supuesto no son visibles hasta realizar una "transaction commited".
    • El depurador integrado parece tener errores (al menos en la versión para windows) - en ocasiones trabajar fuera del IDE puede ayudar a encontrar los errores.
    • En Linux ciertos mensajes de error se imprimen en la consola -- ejecutar los programas mediante la línea de mandatos resulta útil para obtener información extra para su depuracion.
    • Error: "No puedo cargar el cliente PostgreSQL. ¿ Está instalado (libpq.so) ?"
      • Añade la ruta (variable de entorno path) de búsqueda para libpq* donde se instaló PostgreSQL.
      • En Linux añade la ruta al fichero libpq.so a la sección de librerias dentro del fichero /etc/fpc.cfg. Por ejemplo: -Fl/usr/local/pgsql/lib
      • En windows, añade simplemente estas librerias en alguna de las rutas que figuren en la variable de entorno o bien en el directorio o carpeta donde se tenga guardado el proyecto.
      • En windows yo copio todas las librerias que necesito de C:\Program Files\PostgreSQL\8.1\bin a otro directorio que figure en el PATH.
      • También se puede añadir este directorio C:\Program Files\PostgreSQL\8.1\bin al path que resulta bastante mas sencillo y sin tener que mover ficheros de sitio.

Como un buen ejemplo funcional es más útil que mucho que se pueda contar, aquí os dejo un enlace a un programa escrito directamente para Lazarus y que con pequeñas modificaciones os puede permitir conectar con PostgreSQL 8.x en mi caso la prueba la realicé con 8.3 y funcionó. La versión de Lazarus la 0.9.26 Beta. Lo compila sin problemas.

easyDB, en la fecha en la que se traduce este párrafo en la web de descarga figura el fichero easy_db_plus.zip

Es importante cambiar los valores de usuario, contraseña, base de datos a conectar y equipo con el que conectar que puede estar en red o no. Si no está en red puede valer con localhost ó 127.0.0.1 y si lo está pués el nombre del equipo. Lógicamente que el usuario y contraseña estén correctos y que permita realizar lecturas, escrituras, borrado, por lo que es mejor tener un postgreSQL en prueba con acceso total (que no esté en producción). En mi caso verifico el funcionamiento teniendo al mismo tiempo abierto PGADMIN III. Fijaos en la cantidad de librerias que ha incluido en el fichero comprimido, ya que a mi al menos no me ha pedido nada adicional. Un cambio que he realizado es copiar todas las librerias de C:\Archivos de programa\PostgreSQL\8.3\bin sobreescribiendo las que vienen, lo he vuelto a compilar y funciona aceptable (sobre todo para que librerias como libpq.dll al tratarse de una versión más nueva debería estar más optimizada).

Otro enlace interesante que he encontrado es:

Permite obtener un documento con el título Postgresql y Freepascal en FreeBSD.

Lazarus y SQLite

   Por favor, escríbame!

Lazarus y MSSQL

   Por favor, escríbame!

Contribuidores y Cambios

  • Por favor, vea Log de actualizaciones para conocer la historia de modificaciones y agregados a esta página.

http://lazarus-ccr.sourceforge.net/index.php?wiki=DbSpanishTutorial