Difference between revisions of "Lazarus Database Tutorial/es"

From Free Pascal wiki
Jump to navigationJump to search
(Imported from epikwiki, needs clean up)
 
m (Fixed syntax highlighting; deleted category included in page template)
 
(63 intermediate revisions by 11 users not shown)
Line 1: Line 1:
[:css=green.css:]
+
{{Lazarus Database Tutorial}}
;h1 The Lazarus Database Tutorial
+
[[category:Castellano|D]][[category:Español|D]]
[:usernotes=W:]
+
== Introducción ==
**Table of Contents**
 
  
[:toc:]
+
   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".
---
 
;!
 
;h2 Overview
 
;{
 
This tutorial is about getting Lazarus to work with a variety of existing databases.
 
  
Please expand on this section.
+
== Lazarus e Interbase / Firebird ==
  
;}
+
=== Soporte integrado (componentes SQLDB) ===
;h2 Lazarus and MySQL
+
   Ver las páginas de turorías y consejos:
;{
+
* [[Firebird]]
[ChrisKirk|]
+
* [[SQLdb Tutorial1]]
  
1 @@@Get MYSQL working in Linux or Windows, in console mode.
+
   Ver tambien [[Install Packages/es|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.
2 @@@Get MYSQL working for FPC in text mode
 
3 @@@Get MYSQL working in a Lazarus Form
 
4 @@@Download MYSQL **[file://kbdata/mysqldemo.tar.gz|Sample Source Code]**
 
;h4 1 - Get MySQL working in Linux or Windows
 
Follow the instructions in the MySQL User Manual.  Make sure that the mysqld daemon runs reliably, and that all potential users (including root, mysql, yourself and anybody else that may need it) have as many privileges as they need, from as many hosts as may be needed (including 'localhost', the local host's name, any other hosts on your network) as far as is consistent with security.  It is preferable that all users including root have passwords.  Test the action of the database system using the examples given in the manual, and check that all users really do have reliable access.
 
;h4 2 - Get MySQL working for FPC in text mode
 
There is a directory with an example program in $(FreePascal_directory)/packages/base/mysql/ and this directory also contains the units mysql.pp, mysql_com.pp and mysql_version.pp.  Before running the test script, you need to create a database called testdb:  do this by logging into the mysql monitor (as root with full privileges) and issuing the following SQL statement
 
CREATE DATABASE testdb;
 
then make sure that all relevant users have appropriate access privileges to it
 
GRANT ALL ON testdb TO johnny-user IDENTIFIED BY 'johnnyspassword';
 
There is a script called mkdb which you should now try to run:
 
sh ./mkdb
 
This will probably fail, as the system will not allow an anonymous user to access the database.  So change the script using an editor so that the line invoking mysql reads:
 
mysql -u root -p  ${1-testdb} << EOF >/dev/null
 
and try running it again, entering your password when prompted.  With luck you might have managed to create the test database:  test it (while logged in to the mysql monitor) by issuing the mysql statement
 
select * from FPdev;
 
You should see a table listing the ID, username and email address of some of the FPC developers.
 
  
Now try to run the test program testdb.pp (this may need to be compiled, and will almost certainly fail on the first attempt!!).
+
===Zeos===
 +
&nbsp;&nbsp;&nbsp;Firebird tambien funciona con la última versión de la librería Zeos (desde cvs).
  
I found that the program could not connect to mysql for several reasons:
+
===Librería FBLib Firebird===
  
a @@@My system (SuSE Linux v9.0) installs mysql v4.0.15, not the version3 for which the package was designed.
+
&nbsp;&nbsp;&nbsp;[http://fblib.altervista.org FBLib] es una librería de fuentes abiertas, para acceder directamente a las BD relacionales Firebird desde Borland Delphi, Kylix, Free Pascal y Lazarus.
  
b @@@The program needs to have user names and passwords to get access to the database.
+
&nbsp;&nbsp;&nbsp;La funcionalidad actual incluye:
  
c @@@The compiler needs to know where to find the mysql libraries (IF YOU HAVEN'T INSTALLED THE MYSQL DEVELOPMENT LIBRARIES, DO SO NOW!)
+
* 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
  
I created a copy of testdb.pp called trydb.pp, rather than editing the original - this means that the original files still get fixed in subsequent CVS updates.
+
&nbsp;&nbsp;&nbsp;Puedes bajar la documentación de [http://fblib.altervista.org/ sitio de FBLib].
I also copied the files found in the subdirectory mysql/ver40/ into the main mysql/ subdirectory, renaming them mysql_v4.pp, mysql_com_v4.pp and mysql_version_v4.pp, being sure to rename the units within each file correspondingly.  I changed the uses statement in trydb.pp to
 
uses mysql_v4
 
and the statement in mysql_v4.pp to
 
  
 +
[http://www.firebirdnews.org/?p=1769 Aquí] puedes encontrar versiones actualizadas. O, mira en el [https://tiopf.svn.sourceforge.net/svnroot/tiopf/3rdParty/FBLib/Trunk  svn] (Consejo de [http://wiki.lazarus.freepascal.org/User:Guiosoft Guionardo])
  
uses mysql_com_v4
+
== Lazarus y MySQL ==
  
I added a line to /etc/fpc.cfg to point to my libraries:
+
by ChrisKirk
-Fl/lib;/usr/lib
 
and in the /usr/lib directory I had to find the real name of the mysqlclient library.  In my case I had to issue the shell command:
 
ln -s libmysqlclient.so.12.0.0 lmysqlclient
 
to make a symbolic link allowing FPC to find the library.  For good measure I also created the link
 
ln -s libmysqlclient.so.12.0.0 mysqlclient
 
and placed similar links in various other directories:  not strictly necessary, but just in case ...!
 
Some users might need to add the following link:
 
ln -s libmysqlclient.so.12.0.0 libmysqlclient.so
 
  
I modified trydb.pp to include user details, initially by adding host, user and password as constants:
+
# Poner a trabajar MySQL en Linux o Windows, en modo consola.
;{
+
# Poner a trabajar MySQL con FPC en modo texto.
  const
+
# Poner a trabajar MySQL en un formulario Lazarus.
  host : Pchar= 'localhost';
+
# Descargue el Código fuente de ejemplo de MySQL
  user : Pchar= 'myusername';
 
  passwd: Pchar = 'mypassword';
 
;}
 
I also found that I couldn't connect to mysql using the mysql_connect() call, but had to use mysql_real_connect() which has many more parameters.  To complicate things further, the number of parameters seems to have changed between version3 (where there are seven) and version4 (where there are eight).  Before using mysql_real_connect I had to use mysql_init() which is not found in the original mysql.pp but is found in mysql_v4.pp.
 
  
So the code for connection to the database is now:
+
=== 1 - Poner a trabajar MySQL en Linux o Windows ===
;{
+
 
  { a few extra variables}
+
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.
var
+
 
  alloc : PMYSQL;
+
=== 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
{main program fragment}
+
 
    
+
  CREATE DATABASE testdb;
begin
+
 
 +
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
 +
 
 +
<syntaxhighlight lang=pascal> uses mysql_v4</syntaxhighlight>
 +
 
 +
y la sentencia en mysql_v4.pp a
 +
 
 +
<syntaxhighlight lang=pascal> uses mysql_com_v4</syntaxhighlight>
 +
 
 +
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:
 +
 
 +
<syntaxhighlight lang=pascal> const
 +
  host : Pchar= 'localhost';
 +
  user : Pchar= 'myusername';
 +
  passwd: Pchar = 'mypassword';</syntaxhighlight>
 +
 
 +
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:
 +
<syntaxhighlight lang=pascal> { a few extra variables}
 +
  var
 +
    alloc : PMYSQL;
 +
   {main program fragment}  
 +
   begin
 
   if paramcount=1 then
 
   if paramcount=1 then
    begin
+
  begin
 
 
 
     Dummy:=Paramstr(1)+#0;
 
     Dummy:=Paramstr(1)+#0;
 
     DataBase:=@Dummy[1];
 
     DataBase:=@Dummy[1];
    end;
+
  end;  
    
+
   Writeln ('Allocating Space...');
Writeln ('Allocating Space...');
 
 
   alloc := mysql_init(PMYSQL(@qmysql));
 
   alloc := mysql_init(PMYSQL(@qmysql));
 
   Write ('Connecting to MySQL...');
 
   Write ('Connecting to MySQL...');
 
   sock :=  mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);
 
   sock :=  mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);
 
   if sock=Nil then
 
   if sock=Nil then
    begin
+
  begin
 
     Writeln (stderr,'Couldn''t connect to MySQL.');
 
     Writeln (stderr,'Couldn''t connect to MySQL.');
 
     Writeln (stderr, 'Error was: ', mysql_error(@qmysql));
 
     Writeln (stderr, 'Error was: ', mysql_error(@qmysql));
 
     halt(1);
 
     halt(1);
    end;
+
  end;
 
   Writeln ('Done.');
 
   Writeln ('Done.');
 
   Writeln ('Connection data:');
 
   Writeln ('Connection data:');
{$ifdef Unix}
+
  {$ifdef Unix}
 
   writeln ('Mysql_port      : ',mysql_port);
 
   writeln ('Mysql_port      : ',mysql_port);
 
   writeln ('Mysql_unix_port : ',mysql_unix_port);
 
   writeln ('Mysql_unix_port : ',mysql_unix_port);
{$endif}
+
  {$endif}
 
   writeln ('Host info      : ',mysql_get_host_info(sock));
 
   writeln ('Host info      : ',mysql_get_host_info(sock));
 
   writeln ('Server info    : ',mysql_stat(sock));
 
   writeln ('Server info    : ',mysql_stat(sock));
   writeln ('Client info    : ',mysql_get_client_info);
+
   writeln ('Client info    : ',mysql_get_client_info);  
 
 
 
   Writeln ('Selecting Database ',DataBase,'...');
 
   Writeln ('Selecting Database ',DataBase,'...');
 
   if mysql_select_db(sock,DataBase) < 0 then
 
   if mysql_select_db(sock,DataBase) < 0 then
    begin
+
  begin
 
     Writeln (stderr,'Couldn''t select database ',Database);
 
     Writeln (stderr,'Couldn''t select database ',Database);
 
     Writeln (stderr,mysql_error(sock));
 
     Writeln (stderr,mysql_error(sock));
 
     halt (1);
 
     halt (1);
    end;
+
  end;
{... as original contents of testdb.pp}
+
  {... as original contents of testdb.pp}</syntaxhighlight>
;
+
 
 +
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.
  
Now - ready to start compiling trydb.pp?
+
Cree un nuevo proyecto en Lazarus:
  fpc trydb
 
success!  Now run it:
 
  ./trydb
 
whoopee!  I got the listing of the FPC developers!
 
  
A few extra refinements:  make the entry of user details and the mysql commands interactive, using variables rather than constants, and allow several SQL commands to be entered, until we issue the quit command: see the [TryDbpp|full program listing], where user details are entered from the console, and the program goes into a loop where SQL commands are entered from the console (without the terminal semicolon) and the responses are printed out, until 'quit' is entered from the keyboard.
+
Project -> New Project -> Application
  
See [SampleListing|sample console listing].
+
Automáticamente aparecerá un nuevo Form.
;h4 3 - Connecting to MySQL from a Lazarus Application
 
  
This tutorial shows how to connect Lazarus to the MySQL database, and execute simple queries, using only the basic Lazarus components; it uses no Data Aware components, but illustrates the principles of interfacing with the database.
+
Aumente el tamaño del form hasta la mitad de la pantalla, lugo renómbre el formulario y su título como 'TryMySQL'.
  
Create a new project in Lazarus:
+
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.
  Project -> New Project -> Application
 
A new automatically generated Form will appear.
 
  
Enlarge the form to fill about half of the screen, then re-name the form and its caption to 'TryMySQL'.
+
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.
  
From the Standard Component tab place three Edit Boxes on the upper left side of the Form, and immediately above each box place a label.  Change the names and captions to 'Host' (and HostLLabel,HostEdit), 'UserName' (and UserLabel, UserEdit) and 'Password' (with PasswdLabel and PasswdEdit).  Alternatively you could use LabelledEdit components from the Additional tab.
+
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.
  
Select the Passwd Edit box and find the PasswordChar property: change this to * or some other character, so that when you type in a password the characters do not appear on your screen but are echoed by a series of *s.  Make sure that the Text property of each edit box is blank.
+
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.
  
Now place another Edit box and label at the top of the right side of your form.  Change the label to 'Enter SQL Command' and name it CommandEdit.
+
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).
  
Place three Buttons on the form: two on the left under the Edit boxes, and one on the right under the command box.
+
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.
  
Label the buttons on the left 'Connect to Database' (ConnectButton)and 'Exit' (ExitButton) and the one on the right 'Send Query' (QueryButton).
+
Inserte una barra de estado (desde la pestaña Common Controls) en el fondo del formulario y ponga en la propiedad SimpleText 'TryMySQL'.
  
Place a large Memo Box labelled and named 'Results' (ResultMemo) on the lower right, to fill most of the available space. Find its ScrollBars property and select ssAutoBoth so that scroll bars appear automatically if text fills the space.  Make the WordWrap property True.
+
Una captura de pantalla del formulario puede ser vista en: Ejemplo de pantalla Mysql
  
Place a Status Bar (from the Common Controls tab) at the bottom of the Form, and make its SimpleText property 'TryMySQL'.
+
Ahora necesitamos escribir el código para manejar las acciones.
  
A screenshot of the Form can be seen here: **[file://kbdata/trymysqldb.png|Mysql Example Screenshot]**
+
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.
  
Now we need to write some event handlers.
+
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.
  
The three Edit boxes on the left are for entry of hostname, username and password.  When these have been entered satisfactorily, the Connect Button is clicked.  The OnCLick event handler for this button is based on part of the text-mode FPC program above.
+
Las strings son mostradas en el campo Memo usando
  
The responses from the database cannot now be written using the Pascal write or writeln statements: rather, the replies have to be converted into strings and displayed in the Memo box. Whereas the Pascal write and writeln statements are capable of performing a lot of type conversion 'on the fly', the use of a memo box for text output necessitates the explicit conversion of data types to the correct form of string, so Pchar variables have to be converted to strings using StrPas, and integers have to be converted with IntToStr.
+
<syntaxhighlight lang=pascal> procedure ShowString (S : string);
 +
  (* display a string in a Memo box *)
 +
  begin
 +
  |trymysqlForm1.ResultsMemo.Lines.Add (S)
 +
  end;</syntaxhighlight>
  
Strings are displayed in the Memo box using
+
El evento en el botón ConnectButton queda como:
;{
 
procedure ShowString (S : string);
 
(* display a string in a Memo box *)
 
begin
 
        trymysqlForm1.ResultsMemo.Lines.Add (S)
 
end;
 
;}
 
The ConnectButton event handler thus becomes:
 
;{
 
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));
+
<syntaxhighlight lang=pascal> procedure TtrymysqlForm1.ConnectButtonClick(Sender: TObject);
  sock :=  mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);
+
  (* Connect to MySQL using user data from Text entry boxes on Main Form *)
  if sock=Nil then
+
  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
 
     begin
 
       strg :='Couldn''t connect to MySQL.'; showstring (strg);
 
       strg :='Couldn''t connect to MySQL.'; showstring (strg);
 
       Strg :='Error was: '+ StrPas(mysql_error(@qmysql)); showstring (strg);
 
       Strg :='Error was: '+ StrPas(mysql_error(@qmysql)); showstring (strg);
  end
+
    end
 
     else
 
     else
 
     begin
 
     begin
 
       trymysqlForm1.statusBar1.simpletext := 'Connected to MySQL';
 
       trymysqlForm1.statusBar1.simpletext := 'Connected to MySQL';
 
       strg := 'Now choosing database : ' + database; showstring (strg);
 
       strg := 'Now choosing database : ' + database; showstring (strg);
{$ifdef Unix}
+
      {$ifdef Unix}
 
       strg :='Mysql_port      : '+ IntToStr(mysql_port); showstring (strg);
 
       strg :='Mysql_port      : '+ IntToStr(mysql_port); showstring (strg);
 
       strg :='Mysql_unix_port : ' + StrPas(mysql_unix_port); showstring (strg);
 
       strg :='Mysql_unix_port : ' + StrPas(mysql_unix_port); showstring (strg);
{$endif}
+
      {$endif}
 
       Strg :='Host info      : ' + StrPas(mysql_get_host_info(sock));
 
       Strg :='Host info      : ' + StrPas(mysql_get_host_info(sock));
 
       showstring (strg);
 
       showstring (strg);
 
       Strg :='Server info    : ' + StrPas(mysql_stat(sock)); showstring (strg);
 
       Strg :='Server info    : ' + StrPas(mysql_stat(sock)); showstring (strg);
 
       Strg :='Client info    : ' + Strpas(mysql_get_client_info);  showstring (strg);
 
       Strg :='Client info    : ' + Strpas(mysql_get_client_info);  showstring (strg);
 
 
 
       trymysqlForm1.statusbar1.simpletext := 'Selecting Database ' + DataBase +'...';
 
       trymysqlForm1.statusbar1.simpletext := 'Selecting Database ' + DataBase +'...';
  if mysql_select_db(sock,DataBase) < 0 then
+
      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;</syntaxhighlight>
 +
 
 +
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:
 +
 
 +
<syntaxhighlight lang=pascal> procedure TtrymysqlForm1.QueryButtonClick(Sender: TObject);
 +
  var
 +
    dumquery, strg: string;
 
   begin
 
   begin
    strg :='Couldn''t select database '+ Database; ShowString (strg);
+
    dumquery := TrymysqlForm1.CommandEdit.text;
    Strg := mysql_error(sock); ShowString (strg);
+
    dumquery := dumquery+#0;
  end
+
    query := @dumquery[1];
  end;
+
    trymysqlForm1.statusbar1.simpletext := 'Executing query : '+ dumQuery +'...';
end;
+
    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;</syntaxhighlight>
 +
 
 +
Guarde su Proyecto y presione Run -> Run
  
The Text Box on the right allows entry of a SQL statement, without a terminal semicolon;  when you are satisfied with its content or syntax, the SendQuery button is pressed, and the query is processed, with results being written in the ResultsMemo box.
+
El código completo del programa está disponible en Código fuente del ejemplo
  
The SendQuery event handler is again based on the FPC text-mode version, except that once again explicit type-conversion has to be done before strings are displayed in the box.
+
by ChrisKirk
  
A difference from the text-mode FPC program is that if an error condition is detected, the program does not halt and MySQL is not closed;  instead, control is returned to the main form and an opportunity is given to correct the entry before the command is re-submitted.  The application finally exits (with closure of MySQL) when the Exit Button is clicked.
+
== Lazarus y PostgreSQL ==
  
The code for SendQuery follows:
+
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.
;{
 
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;
 
;}
 
  
Save your Project, and press Run -> Run
+
Después de una correcta instalación tanto de Lazarus como de PostgreSQL, debemos seguir los siguientes pasos:
  
A full listing of the  program is available here **[file://kbdata/mysqldemo.tar.gz|Sample Source Code]** 
+
1.- Situar en el formulario los siguientes componentes:
  
 +
'''  COMPONENTE      /      UBICACION EN EL IDE  '''
  
[ChrisKirk|]
+
*  PQConnection --------->  SQLdb
;}
+
*    SQLQuery --------------->  SQLdb
;h3 Spanish translation of this page
+
*    SQLTransaction ------->  SQLdb
;{
+
*    DataSource ----------> DataAccess
by Eduardo Lopez (thanks!) [DbSpanishTutorial|Available here]
+
*    DBGrid ----------------> DataControls
  
;}
+
2.- En el inspector de objetos una vez seleccionado en el formulario PQConnection rellenar los valores de las siguientes propiedades:
;h2 Lazarus and Postgresql
 
;{
 
Please write me!
 
;}
 
;h2 Lazarus and SQLite
 
;{
 
by Luiz Américo
 
  
**Introduction**
+
* "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.
  
There are two TDataset descendants which access sqlite2.x databases: sqlitedataset.TSqlite and sqliteds.TSqliteDataset. The second is newer and has some advantages over the former: its faster, allows inserts, updates and deletes and can apply the updates to the database automatically. So the instructions found here are valid only for the TSlqiteDataset class which is found in unit sqliteds.pas 
+
3.- Comprobar que SQLTransaction ha cambiado automáticamente para apuntar a PQConnection.
  
**Requeriments**
+
4.- En SQLQuery rellenar lo siguiente:
* fpc 1.9.4 (not tested with 1.9.5)
 
* lazarus
 
* FCL db files (get from fpc/fcl/db at CVS)
 
* sqliteds.pas (get from fpc/fcl/db/sqlite at CVS)
 
* sqlite.pp (comes with 1.9.4 sources)
 
* sqlite runtime library 2.15 or above (get from www.sqlite.org)
 
  
Please assume that all mentioned files (except sqlite.pp) are from at least 2004/10/23
+
* "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')
  
__Before initiating a lazarus projects, ensure that:__
+
5.- En el objeto DataSource rellenar:  
* the sqlite library is on the system PATH
 
* sqlite.pp is on fpc unit PATH (binary releases doesn't provides it)
 
* under linux, put cmem as the first unit in uses clause
 
  
**How to use**
+
* "DataSet":  objeto SQLQuery.
  
For now, there's no lazarus package, so it's needed to add a TSqliteDataset variable and create the instance at runtime, generally in main from OnOpen event.
+
6.- En el componente DBGrid rellenar:
Then set the following properties:
 
  
- FileName: path of the sqlite file
+
* "DataSource": objeto DataSource.
- Sql: a select SQL statement
 
- TableName: name of the table used in the sql statement 
 
  
||Creating a table (dataset)||
+
7.- Modificar todo para que figure como conectado (connected) y activo (active)
  
If is the first time accessing the dataset then it's necessary to create the table layout.
+
* TDBText y TDBEdit parecen funcionar pero (al menos para mí) solamente muestra datos en la grid.
The example below checks if the filename exists and if no, create a table with all field types currently supported by TSqliteDataset:
 
  dsTest:= TSqliteDataset.Create(nil);
 
  with dsTest do
 
  Begin
 
    FileName:='New.db';
 
    TableName:='NewTable';
 
    if not FileExists(FileName) then
 
    begin
 
    with FieldDefs do
 
      begin
 
        Clear;
 
        Add('Integer',ftInteger,0,False);
 
        Add('String',ftString,0,False);
 
        Add('Bool',ftBoolean,0,False);
 
        Add('Float',ftFloat,0,False);
 
        Add('Word',ftWord,0,False);
 
        Add('DateTime',ftDateTime,0,False);
 
        Add('Date',ftDate,0,False);
 
        Add('Time',ftTime,0,False);
 
      end;
 
    CreateTable;
 
  end;
 
 
 
||Connecting to a data source||
 
  
After created the SqliteInstance set it to the Dataset property of a TDatasource.   
+
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:
  
||Retrieving the data||
+
<syntaxhighlight lang=pascal> 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;</syntaxhighlight>
  
If you already created the dataset or if the file already exists than you can set the sql with the fields you want to retrieve and then call Open method.
+
* Notas:
. It's possible to retrieve all fields or a set of the available fields as bellow:
+
** Testeado en windows, Lazarus 0.9.12 + PgSQL 8.3.1
  SQL:='Select * from NewTable';
+
** Algunos test realizados  en linux, Lazarus 0.9.12 and PgSQL 8.0.x.
  SQL:='Select Float from NewTable';
 
  SQL:='Select String,Date,Word from NewTable';
 
  
Remender that the number of fields and the order of the fields that will be available after opening the dataset are determined by the select statement. In the previous examples the dataset would have 8, 1 and 3 fields respectively.
+
* 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.
  
||Applying changes to the underlying datafile||
+
* http://paginas.fe.up.pt/~asousa/wiki/doku.php?id=proj:lazarus_projects
  
For now, it's necessary to set _ROWID_ (which is available in all sqlite databases) as the first field.
+
[http://paginas.fe.up.pt/~asousa/wiki/doku.php?id=proj:lazarus_projects easyDB], en la fecha en la que se traduce este párrafo en la web de descarga figura el fichero easy_db_plus.zip
For example:
 
  Sql:=select _ROWID_,* from NewTable
 
 
 
After this just call ApplyUpdates 
 
  
**Remarks**
+
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).
  
* Although tested with 10000 records and worked fine, TSqliteDataset keeps all the data in memory, so remenber to retrieve only the necessary data.
+
Otros enlaces interesantes que he encontrado son:
* The same datafile(filename property) can host several tables/datasets
 
* Several datasets can be created using the same table simultaneously
 
* It's possible to filter the data using WHERE statements in the sql, closing and reopening the dataset. But in this case, the order and number of fields must remains the same
 
* It's also possible to use complexes SQL statements using aliases or joins in multiples tables (remenber that they must reside in the same datafile), but in this case ApplyUpdates won't work. If someone wants to use complexes queries and to apply the updates to the datafile, mail me and i will give some hints how to do that
 
* Setting filename to a sqlite2.x datafile not created by TSqliteDataset and opening it is allowed but some fields won't have the correct field type detected.These will be treated as string fields.
 
  
---
+
* http://hdcm.sytes.net/documentos/programacion/lazarus/Lazarus_postgresql.html
  
It can be find a working example of a lazarus app using TSqliteDataset at http://www.geocities.com/camara_luiz/3dcompare.zip
+
Permite obtener un documento con el título '''Postgresql y Freepascal en FreeBSD'''.
Also there are generic examples in fpc/fcl/sqlite CVS dir
 
  
Luiz Américo
+
== Lazarus y SQLite ==
pascalive(at)bol(dot)com(dot)br
 
;}
 
;h2 Lazarus and MSSQL
 
;{
 
Please write me!
 
;}
 
  
;}
 
;h2 Lazarus and dBase
 
;{
 
[TonyMaro|]
 
  
You might also want to visit the beginnings of the [TdbfTutorial|TDbf Tutorial page]
+
===Introducción===
  
FPC includes a simple database component that is similar in function to the Delphi TTable component called "TDbf" ([http://tdbf.sourceforge.net/|TDbf Website]) that supports a very basic subset of features for dBase files.  It is not installed by default, so you will first need to install the Lazarus package from the "lazarus/components/tdbf" directory and rebuild your Lazarus IDE.  It will then appear next to the TDatasource in your component palette.
+
Para poder acceder a bases de datos basadas en el motor de SQLITE son necesarios los siguientes componentes (Ambos descendientes de TDataset) :  
  
The TDbf component has an advantage over other database components in that it doesn't require any sort of runtime database engine, however it's not the best option for large database applications.
+
* 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.
  
It's very easy to use.  Simply, put, drop a TDbf on your form, set the runtime path to the directory that your database files will be in, set the table name, and link it to your TDatasource component.
+
Relación de Ventajas/Desventajas:
  
Real functionality requires a bit more effort, however. If a table doesn't already exist, you'll need to create it programmatically, unless there's a compatible table designer I'm not familiar with.
+
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.
  
Attempting to open a non-existant table will generate an error.  Tables can be created programmatically through the component after the runtime path and table name are set.
+
Desventajas:
  
For instance, to create a table called "dvds" to store your dvd collection you would drop it on your form, set the runtime path, and set the table name to "dvds".  The resulting file will be called "dvds.dbf".
+
* Requiere la librería sqlite.
  
In your code, insert the following:
+
===Requerimientos===
  
    Dbf1.FilePathFull = '/path/to/my/database';
+
* Para bases de datos sqlite2:
    Dbf1.TableName = 'dvds';
+
** fpc 2.0.0
    With Dbf1.FieldDefs do begin
+
** Lazarus 0.9.10
        Add('Name', ftString, 80, True);
+
** sqlite runtime library 2.8.15 o superior
        Add('Description', ftMemo, 0, False);
 
        Add('Rating', ftString, 5, False);
 
    end;
 
    Dbf1.CreateTable;
 
  
When this code is run, your DVD collection table will be created. After that, all data aware components linked through the TDatasource to this component will allow easy access to the data.
+
* Para bases de datos sqlite3:
 +
** fpc 2.0.2
 +
** Lazarus 0.9.11
 +
** sqlite runtime library 3.2.1 o superior )
  
;h4 Note: the index example only works with the CVS edition of FPC
+
'''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)
  
Adding indexes is a little different from your typical TTable. It must be done after the database is open. It's also the same method you use to rebuild the indexes.  For instance:
+
* '''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.'''
  
    Dbf1.Exclusive := True;
+
===Como usar la base de datos===
    Dbf1.Open;
 
    Dbf1.AddIndex('dvdsname','Name',[ixPrimary, ixUnique, ixCaseInsensitive]);
 
    Dbf1.AddIndex('rating.ndx', 'Rating', [ixCaseInsensitive]);
 
    Dbf1.Close;
 
  
The first (primary) index will be a file called "dvdsname.mdx" and the second will be a file named "rating.ndx" so in a multiple table database you must be careful not to use the same file name again.
+
Instalar el paquete SQLITE en lazarus. '''Se recomienda usar la versión con el componente ya instalado.'''
  
I will try to add a more detailed example at a later date, but hopefully this will get those old Delphi programmers up and running with databases in Lazarus!
+
- '''En tiempo de diseño asignar las siguientes propiedades básicas:'''
  
;h3 Lazarus and dBase -- How to update your copy
+
* ''FileName:'' ruta al archivo slqlite [Obligatorio]
[YoyongHernan|]
+
* ''TableName:'' nombre de la tabla que se quiere acceder [Obligatorio]
 +
* ''Sql:'' una sentencia SQL [opcional]  
  
How to use TDbf in lazarus (Linux)
+
- '''Crear una tabla de datos'''
  
1. Update your copy of fcl. FPC verion 1.9.4 is known to work prorperly with this package.
+
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.
  
Steps to update:
+
- ''' Listado de tipos de datos soportados por TSqliteDataset y TSqlite3Dataset:'''
a. Assuming that the cvs files from FPC is located in repo. Then
+
 
  cd ~/repo
+
  Integer
 +
  AutoInc
 +
  String
 +
  Memo
 +
  Bool
 +
  Float
 +
  Word
 +
  DateTime
 +
  Date
 +
  Time
 +
  LargeInt
 +
  Currency
  
b. Login to cvs
+
- '''Leer los datos de la base de datos'''
  cvs -d :pserver:cvs@cvs.freepascal.org:/FPC/CVS login
 
  password is cvs
 
  
c. Now the actual update
+
Una vez que se ha creado la tabla basta usar el procedimiento 'Open'
  cvs -d :pserver:cvs@cvs.freepascal.org/FPC/CVS -z 3 update fpc/fcl
+
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:
The above command will udpate your fcl source copy.
 
  
d. Delete some files in your fcl directory.
+
   SQL:='Select * from TABLENAME';
   su
 
  cd /usr/local/lib/fpc/1.9.4/units/linux/fcl
 
  rm db*.*
 
Note: Change to the directory specified in "cd" accordingly.
 
Note: To check the exact location of the units. Assuming of course that you have a working FPC configuration. Type
 
  fpc -vt bogus
 
And look for something that reads
 
Using unit path: /usr/local/lib/fpc/1.9.4/*
 
Note: In almost all systems, you need to be the root user to do this.
 
  
e. Compile the newest Tdbf sources.
+
'''Actualizar / Modificar los datos de la base de datos'''
Goto to your FPC FCL directory
 
  cd ~/repo/fpc/fcl/db
 
  make && make install
 
The above command will try to compile your sources in the db directory and install the units into /usr/local/bin/fpc/1.9.4/units/linux/fcl
 
Note: Must be root for make install to succeed.
 
  
f. Check if the units are there. Now the tricky part. As of this time, FPC compiler will search for your units based on two steps. First it will check if the unit can be found by using the uppercase of your units, i.e.,DB.PPU. If the compiler cannot find this it will try db.ppu. As you can see the files just compiled shows that the units starts with capital D??????. So this will fail your system to find the units for the tdbf. To remedy this just change all Db*.* to lowercase.
+
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).
  
If you are lazy like me, you can use the perl script below to change the case to lowercase.
+
'''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'''
  #!/usr/bin/perl
 
  use Cwd;
 
  use File::Copy;
 
  
  #this script will rename the files to lower case. useful for FPC programming
+
Para que las tablas tengan claves primarias se puede:
  
  printf "This renames all the files to lower case found in the current directory\n";
+
* 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.
  
  #create a directory containing the lowercase files
+
== Lazarus y MSSQL ==
  if (length(`ls -d lcase`) > 0 ){
 
  print "directory exists\n";
 
  print "Deleting files located in lcase directory\n";
 
  `rm -d -r lcase`;
 
  }
 
  `mkdir lcase`;
 
  
 +
    Por favor, escríbame!
  
  #get the current directory
 
  $dir = cwd();
 
  $source = $dir;
 
  #set to the source directory
 
  $source .= "/source";
 
  
  #open the directory
+
== Mensajes de error ==
  opendir(DIR, $source);
 
  #read the files/direcotry
 
  @dirlist = readdir(DIR);
 
  
  #process the files now
+
Se pueden generar errores que debemos leer detenidamente para tratar de solventarlos o gestionarlos.
  chdir($source);
 
  foreach $myfile(@dirlist) {
 
  print "copying file $myfile\n";
 
  $newfile = $dir;
 
  $newfile .= "/lcase/";
 
  $newfile .= lc($myfile);
 
  copy($myfile,$newfile);
 
  }
 
  
 +
* 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).
  
  #close the opened directory
+
Dejo aquí los enlaces al foro donde se habla sobre esto:
  closedir(DIR);
 
  
I. Save the script in /home/yourdirectory/temp/renameme.pl
+
http://forum.lazarus.freepascal.org/index.php?topic=8319.0
II. Change the mode of the file
 
    chmod 755 renameme.pl
 
III. Move all the Db*.* from /usr/local/lib/fpc/1.9.4/units/linux/fcl to /home/yourdirectory/temp/source.
 
IV. Run renameme.pl
 
    ./renameme.pl
 
V. Copy the files in /home/yourdirectory/temp/lcase to /usr/local/lib/fpc/1.9.4/units/linux/fcl
 
  
2. Run Lazarus.
+
* Error Database not assigned:
  
3. Install the TDbf package
+
== Contribuidores y Cambios ==
Compoenents->Open Package File->Browse to lazarus_directory/components/tdbf/dbflaz.lpk
 
  
4. Click on compile.
+
* 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
  
5. Click on install. Upon lazarus restart the new component can be found in Data Access Page.
+
== 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/
  
;h2 Contributors and Changes
+
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.
* Please see the [SiteUpdateLog#LazarusDatabase|] for a history of additions and changes to this page
 

Latest revision as of 00:46, 19 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.