Difference between revisions of "Lazarus Database Tutorial/es"

From Lazarus wiki
Jump to navigationJump to search
m (Fixed syntax highlighting; deleted category included in page template)
 
(3 intermediate revisions by 2 users not shown)
Line 11: Line 11:
 
=== Soporte integrado (componentes SQLDB) ===
 
=== Soporte integrado (componentes SQLDB) ===
 
   Ver las páginas de turorías y consejos:
 
   Ver las páginas de turorías y consejos:
* [[Firebird_in_action|Firebird in action]]
+
* [[Firebird]]
 
* [[SQLdb Tutorial1]]
 
* [[SQLdb Tutorial1]]
  
Line 92: Line 92:
 
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
 
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
  
<syntaxhighlight> uses mysql_v4</syntaxhighlight>  
+
<syntaxhighlight lang=pascal> uses mysql_v4</syntaxhighlight>  
  
 
y la sentencia en mysql_v4.pp a
 
y la sentencia en mysql_v4.pp a
  
<syntaxhighlight> uses mysql_com_v4</syntaxhighlight>  
+
<syntaxhighlight lang=pascal> uses mysql_com_v4</syntaxhighlight>  
  
 
Agregué una línea a /etc/fpc.cfg que apunta a mis bibliotecas:
 
Agregué una línea a /etc/fpc.cfg que apunta a mis bibliotecas:
Line 117: Line 117:
 
Modifiqué trydb.pp para incluir el detalle del usuario, inicialmente agregando el host, usuario y contraseña como constantes:
 
Modifiqué trydb.pp para incluir el detalle del usuario, inicialmente agregando el host, usuario y contraseña como constantes:
  
<syntaxhighlight> const
+
<syntaxhighlight lang=pascal> const
 
   host : Pchar= 'localhost';
 
   host : Pchar= 'localhost';
 
   user : Pchar= 'myusername';
 
   user : Pchar= 'myusername';
Line 125: Line 125:
  
 
Por lo tanto, el código para la conexión a la base de datos ahora es:
 
Por lo tanto, el código para la conexión a la base de datos ahora es:
<syntaxhighlight> { a few extra variables}
+
<syntaxhighlight lang=pascal> { a few extra variables}
 
   var
 
   var
 
     alloc : PMYSQL;
 
     alloc : PMYSQL;
Line 213: Line 213:
 
Las strings son mostradas en el campo Memo usando
 
Las strings son mostradas en el campo Memo usando
  
<syntaxhighlight> procedure ShowString (S : string);
+
<syntaxhighlight lang=pascal> procedure ShowString (S : string);
 
   (* display a string in a Memo box *)
 
   (* display a string in a Memo box *)
 
   begin
 
   begin
Line 221: Line 221:
 
El evento en el botón ConnectButton queda como:
 
El evento en el botón ConnectButton queda como:
  
<syntaxhighlight> procedure TtrymysqlForm1.ConnectButtonClick(Sender: TObject);
+
<syntaxhighlight lang=pascal> procedure TtrymysqlForm1.ConnectButtonClick(Sender: TObject);
 
   (* Connect to MySQL using user data from Text entry boxes on Main Form *)
 
   (* Connect to MySQL using user data from Text entry boxes on Main Form *)
 
   var strg: string;
 
   var strg: string;
Line 267: Line 267:
 
El código para SendQuery es:
 
El código para SendQuery es:
  
<syntaxhighlight> procedure TtrymysqlForm1.QueryButtonClick(Sender: TObject);
+
<syntaxhighlight lang=pascal> procedure TtrymysqlForm1.QueryButtonClick(Sender: TObject);
 
   var
 
   var
 
     dumquery, strg: string;
 
     dumquery, strg: string;
Line 356: Line 356:
 
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:
  
<syntaxhighlight> try
+
<syntaxhighlight lang=pascal> try
 
     sql:= 'UPDATE table SET setting=1';
 
     sql:= 'UPDATE table SET setting=1';
 
     PQDataBase.Connected:=True;
 
     PQDataBase.Connected:=True;
Line 498: Line 498:
  
 
     Por favor, escríbame!
 
     Por favor, escríbame!
 +
 +
 +
== Mensajes de error ==
 +
 +
Se pueden generar errores que debemos leer detenidamente para tratar de solventarlos o gestionarlos.
 +
 +
* Cannot Open a non-select Statement: En este caso nos indica claramente que no podemos utilizar una sentencia SQL que sea diferente de SELECT al utilizar el componente SQLQUERY. Para estos casos diferentes de SELECT utilizar EXECSQL por ejemplo (caso de UPDATE, INSERT por ejemplo).
 +
 +
Dejo aquí los enlaces al foro donde se habla sobre esto:
 +
 +
http://forum.lazarus.freepascal.org/index.php?topic=8319.0
 +
 +
* Error Database not assigned:
  
 
== Contribuidores y Cambios ==
 
== Contribuidores y Cambios ==
Line 512: Line 525:
  
 
En el caso de facturlinex2 aparte de los paquetes dcpcrypt-2.0.4.1, powerpdf_20100305 e Inet utiliza el paquete de acceso a bases de datos ZEOSDBO-6.6.6-stable.
 
En el caso de facturlinex2 aparte de los paquetes dcpcrypt-2.0.4.1, powerpdf_20100305 e Inet utiliza el paquete de acceso a bases de datos ZEOSDBO-6.6.6-stable.
 
[[Category:Databases/es]]
 

Latest revision as of 23:46, 18 February 2020

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.

   Lazarus admite varias bases de datos externas, sin embargo, el desarrollador debe instalar los paquetes requeridos (liberías de cliente) para cada uno de los SGBD. Puede acceder a la base de datos a través de código o poniendo componentes en un formulario. Los componentes ligados a datos representan los campos y se conectan mediante dando valor a la propiedad DataSource para que apunte a un origen de datos (TDataSource). El origen de datos representa una tabla y se conecta a los componentes de base de datos (por ejemplo: TPSQLDatabase y TSQLiteDataSet) estableciendo la propiedad DataSet. Los componentes de datos se encuentran en la pestaña "Data Controls". El origen de datos y los controles de bases de datos se encuentran en la pestaña "Data Access".

Lazarus e Interbase / Firebird

Soporte integrado (componentes SQLDB)

   Ver las páginas de turorías y consejos:

   Ver tambien Instalar paquetes. En esta página hay un pequeño ejemplo y una explicación acerca de cómo conectarse a un servidor de IB o FB.

Zeos

   Firebird tambien funciona con la última versión de la librería Zeos (desde cvs).

Librería FBLib Firebird

   FBLib es una librería de fuentes abiertas, para acceder directamente a las BD relacionales Firebird desde Borland Delphi, Kylix, Free Pascal y Lazarus.

   La funcionalidad actual incluye:

  • Acceso directo a Firebird 1.0.x 1.5.x, 2.x Classic o SuperServer
  • Multiples plataformas [Win32,Gnu/Linux,FreeBSD)
  • Selección automática de la librería cliente 'fbclient' o 'gds32'
  • Consultas SQL parmetrizables
  • Suporta el dialecto 1/3 de SQL
  • Licencia LGPL
  • Extrae Metadatos
  • Analizador simple de guiones
  • Únicamnete añade 100-150 KB al EXE final
  • Suporta campos BLOB
  • Exporta Datos a HTML, SQL, Script
  • Gestor de servicios (copias de seguridad,volcados,gfix...)
  • Alertas de Eventos

   Puedes bajar la documentación de sitio de FBLib.

Aquí puedes encontrar versiones actualizadas. O, mira en el svn (Consejo de Guionardo)

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

 uses mysql_v4

y la sentencia en mysql_v4.pp a

 uses mysql_com_v4

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:

 const
  host : Pchar= 'localhost';
  user : Pchar= 'myusername';
  passwd: Pchar = 'mypassword';

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:

 { 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,'Couldn''t 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,'Couldn''t select database ',Database);
    Writeln (stderr,mysql_error(sock));
    halt (1);
  end;
  {... as original contents of testdb.pp}

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

 procedure ShowString (S : string);
  (* display a string in a Memo box *)
  begin
  |trymysqlForm1.ResultsMemo.Lines.Add (S)
  end;

El evento en el botón ConnectButton queda como:

 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] ;<br>
    alloc := mysql_init(PMYSQL(@qmysql));
    sock :=  mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);
    if sock=Nil then
    begin
      strg :='Couldn''t 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 :='Couldn''t select database '+ Database; ShowString (strg);
        Strg := mysql_error(sock); ShowString (strg);
      end
    end;
  end;

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:

 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;

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:

 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;
  • 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).

Otros enlaces interesantes que he encontrado son:

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

Lazarus y SQLite

Introducción

Para poder acceder a bases de datos basadas en el motor de SQLITE son necesarios los siguientes componentes (Ambos descendientes de TDataset) :

  • TSqliteDataset: para acceder a bases de datos cuya versión sea 2.8.x.
  • TSqlite3Dataset: para acceder a bases de datos cuya versión sea 3.x.x.

Relación de Ventajas/Desventajas:

Ventajas:

  • Flexibilidad: Los programadores pueden elegir entre usar o no el lenguaje sql, permitiéndoles trabajar con tablas de datos simples o tan complejas como se desee.
  • Actualización automatica de las bases de datos: no hay necesidad de actualizar la base de datos manualmente desde comandos sql, una serie de procedimientos establecidos se encargaran de ello.
  • Rapidez: realiza una cache en memoria de los datos, lo que permite una visualización y navegación por los datos rápida.
  • Estructura NO cliente/servidor: sólo es necesario distribuir la librería de sqlite.

Desventajas:

  • Requiere la librería sqlite.

Requerimientos

  • Para bases de datos sqlite2:
    • fpc 2.0.0
    • Lazarus 0.9.10
    • sqlite runtime library 2.8.15 o superior
  • Para bases de datos sqlite3:
    • fpc 2.0.2
    • Lazarus 0.9.11
    • sqlite runtime library 3.2.1 o superior )

Recomendaciones:

  • La libreria sqlite está en el system PATH o en el directorio de trabajo.
  • Bajo Linux ponga cmem como la primera unidad en uses .
    • En debian y derivadas ( ubuntu, Mepis, Mint... ), para construir Lazarus serán necesarios los paquetes libsqlite-dev/libsqlite3-dev además de los sqlite/sqlite3 (También se aplica a OpenSuSe)
  • Las últimas versiones de Lazarus ( 0.9.23 o superiores ) ya incluyen por defecto el componente sqlite3, por lo que se recomienda su uso ya que es automáticamente configurado por el entorno.

Como usar la base de datos

Instalar el paquete SQLITE en lazarus. Se recomienda usar la versión con el componente ya instalado.

- En tiempo de diseño asignar las siguientes propiedades básicas:

  • FileName: ruta al archivo slqlite [Obligatorio]
  • TableName: nombre de la tabla que se quiere acceder [Obligatorio]
  • Sql: una sentencia SQL [opcional]

- Crear una tabla de datos

Hacer doble clic en tiempo de diseño sobre el componente o usar el comando 'Create Table' del menú contextual (aparece al pulsar con el botón derecho del ratón) y se mostrará un simple editor auto explicado de tabla.

- Listado de tipos de datos soportados por TSqliteDataset y TSqlite3Dataset:

 Integer
 AutoInc
 String
 Memo
 Bool 
 Float
 Word
 DateTime
 Date
 Time
 LargeInt
 Currency

- Leer los datos de la base de datos

Una vez que se ha creado la tabla basta usar el procedimiento 'Open' si la propiedad SQL no se estableció se devuelven todas las entradas de la tabla especificada en la propiedad 'TableName', es equivalente a ejecutar la sentencia SQL:

 SQL:='Select * from TABLENAME'; 

Actualizar / Modificar los datos de la base de datos

Para actualizar los datos se usa la función 'ApplyUpdates'. Para poder usar la función la tabla de datos ha de contener alguna entrada que cumpla las condiciones de clave primaria ( los valores tienen que ser UNIQUE y not NULL).

Se recomienda encarecidamente el diseño de la base de datos mediante paradigmas relacionales como el modelo relacional de Chen u otros antes de implementar la base de datos, de esta forma se garantiza la integridad referencial, el uso de claves primarias etc, que evitaran problemas en la implementación

Para que las tablas tengan claves primarias se puede:

  • Establecer el nombre de la propiedad 'PrimaryKey' al nombre de la clave primaria de la tabla.
  • Añadir la opción AutoInc (autoincremento) al campo que deseamos que sea la clave primaria. De esta forma sqlite adoptará por defecto este campo como la clave primaria.

Lazarus y MSSQL

   Por favor, escríbame!


Mensajes de error

Se pueden generar errores que debemos leer detenidamente para tratar de solventarlos o gestionarlos.

  • Cannot Open a non-select Statement: En este caso nos indica claramente que no podemos utilizar una sentencia SQL que sea diferente de SELECT al utilizar el componente SQLQUERY. Para estos casos diferentes de SELECT utilizar EXECSQL por ejemplo (caso de UPDATE, INSERT por ejemplo).

Dejo aquí los enlaces al foro donde se habla sobre esto:

http://forum.lazarus.freepascal.org/index.php?topic=8319.0

  • Error Database not assigned:

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

Programas Lazarus que utilizan acceso a bases de datos

Como ejemplo práctico podemos encontrar los siguientes programas:

  - Facturlinex: http://sourceforge.net/projects/facturlinex/
  - Contalinex: http://sourceforge.net/projects/contalinex/

En el caso de facturlinex2 aparte de los paquetes dcpcrypt-2.0.4.1, powerpdf_20100305 e Inet utiliza el paquete de acceso a bases de datos ZEOSDBO-6.6.6-stable.