Lazarus Database Overview/es

From Lazarus wiki
Jump to: navigation, search

English (en) español (es) français (fr) 日本語 (ja) русский (ru)

Descripción

Este artículo es una descripción sobre que tipos de bases de datos pueden utilizarse con Lazarus.

Lazarus soporta varios tipos de bases de datos (utilizando e.g. el framework de SQLDB), sin embargo el desarrollador debe instalar los paquetes requeridos (librerías cliente) para cada una.

Se puede acceder a la base de datos por medio de código o ubicando componentes visuales en un formulario. Los componentes data-aware representan campos y se conectan estableciendo la propiedad de fuente de datos (DataSource) de manera que apunte a un TDataSource. El DataSource representa una tabla y se conecta a los componentes de bases de datos (ejemplos: TPSQLDatabase, TSQLiteDataSet) estableciendo la propiedad DataSet. Una vez establecido un DataSource correcto y accesible nos permite escoger un DataField concreto de los disponibles. Los componentes data-aware están localizados en la solapa "Data Controls". Los controles DataSource y DataBase están localizados en la solapa "DataAccess".


Ver tutoriales para acceso a bases de datos BBDD con Lazarus/FPC, suitable para Firebird, MySQL, SQLite, PostgreSQL etc:

Lazarus e Interbase / Firebird

  • Por favor ver Firebird en acción para detalles sobre los distintos métodos de acceso, los cuales incluyen:
  1. Soporte incluido internamente de SQLDB.
  2. FBLib.
  3. IBX.
  4. PDO.
  5. Zeos.

Para un tutorial que te guie a través de la manera de crear un GUI (Graphical User Interface) para una base de datos Firebird, ver:

Lazarus y MySQL

  • Por favor echa un vistazo a mysql para más detalles sobre los distintos métodos de acceso, los cuales incluyen:
  1. Soporte incluido internamente en SQLDB.
  2. PDO.
  3. Zeos.

--Jma sp 10:19, 19 June 2015 (CEST)== Lazarus y MSSQL/Sybase ==

Se puede conectar a un servidor de bases de datos SQL de Microsoft utilizando:

  1. Incluido internamente en SQLdb (recientemente con Lazarus/FPC 2.6.1+): TMSSQLConnection (MS SQL) y TSybaseConnection (Sybase ASE)
    1. Para Windows puedes descargar una versión reciente de la librería FreeTDS (disponible en versiones de 32 y 64 bits) dblib.dll desde: | aquí o bien compilarla a partir de sus fuentes de una versión actualizada que se encuentra | aquí
    1. No necesario normalmente: mediante la modificación del fichero dblib.pas de FPC, SQLDB puede utilizar la librería "nativa" ntwdblib.dll en lugar de la librería por defecto FreeTDS dblib.dll (en este caso FPC necesita recompilarse).
    1. En Linux por defecto se utiliza la librería FreeTDS libsybdb.so (por ejemplo, en Debian se encuentra en el paquete libsybd5).
  1. Componente Zeos mediante TZConnection (para el último CVS, ver enlaces a Zeos en esta página).
    1. En Windows se puede escoger entre la libería nativa ntwdblib.dll (protocolo mssql) o las librerías FreeTDS (protocolo FreeTDS_MsSQL-nnnn) donde nnnn es una de cuatro variantes dependiendo de la versión de servidor. Para Delphi (no Lazarus) existe además otro protocolo Zeos ado para MSSQL 2005 o posterior. Utilizando protocolos mssql o ado se genera código que no es independiente de la plataforma.
    1. En Linux el único camino es con los protocolos y librerías FreeTDS (debería utilizarse libsybdb.so).
  1. ODBC (MSSQL y Sybase ASE) con SQLdb TODBCConnection ( ver además)
    1. En Windows utilizalas librerías nativas de Microsoft para ODBC (tales como sqlsrv32.dll para MSSQL 2000)
    1. En Linux utiliza unixODBC + FreeTDS (paquetes unixodbc o iodbc, y tdsodbc). Desde 2012 se tiene también un driver ODBC (versión 1.0) para Microsoft SQL Server. Existe además un driver ODBC (versión 1.0) para Linux que permite conectar con Microsoft SQL Server pero es un producto binario (no código abierto), de 64 bits y solamente para la distribución RedHat.

Para más detalles sobre el uso de SQLDB orientado a Sybase ASE y MSSQL Server consultar los ficheros de ayuda de FPC y Lazarus.

Note-icon.png

Note: En cualquiera de las maneras mostradas se puede conectar utilizando el protocolo TCP/IP, e.g en el puerto 1433.


Si se utilizan librerías nativas de Microsoft (bajo Windows) es posible conectar a un servidor remoto con Named Pipes. Por contra las libería FreeTDS no soportan Named Pipes.

Note-icon.png

Note: Lazarus 1.0 se ha creado con FPC 2.6.0 y no incluye TMSSQLConnection o TSybaseConnection. Si se necesitan la manera más sencilla es descargar el snapshot de la última compilación con FPC 2.6.1, instalándolo en un directorio diferente de la versión 1.0. Se puede utilizar --primary-config-path para establecer un ambiente diferente para que no interfiera con la existente.(ver)

Lazarus y ODBC

ODBC es un estandar genérico de conexión a bases de datos que está disponible en Linux, Windows y OSX. Para la conexión a la base de datos se necesita un driver ODBC y establecer una fuente de datos (data source) que también se conoce con DSN. Se pueden utilizar los componentes SQLDB (TODBCConnection) para conectar a una fuente de datos ODBC.

Para más detalles y ejemplos ver enlace.

Lazarus y Oracle

  • Los métodos de acceso incluyen:
  1. Soporte implementado internamente en SQLDB.
  1. Zeos.

Lazarus y PostgreSQL

  • Ver postgres para más detalles sobre los diversos métodos de acceso entre los que se incluyen:
  1. Soporte implementado internamente SQLdb. Utilizar el componente TPQConnection de la paleta de SQLdb.
  1. Zeos. Utilizar el componente TZConnection con el protocolo 'postgresql' de la paleta de Zeos Access.

Lazarus y SQLite

SQLite es una base de datos embebida; el código de la base de datos puede distribuirse como una librería (.dll/.so/.dylib) con la aplicación para crear una autocontenida (comparable con Firebird embebido). SQLite es tan popular debido a su relativa simplicidad, velocidad, pequeño tamaño y soporte de plataforma cruzada.

Ver la página sobre SQLite para más detalles de los distintos métodos de acceso, entre los que se incluyen:

  1. Soporte implementado internamente por SQLDb.
  1. Zeos.
  1. SQLitePass.
  1. TSQLite3Dataset.

Lazarus y dBase

FPC incluye un componente simple de base de datos que está derivado del TTable de Delphi llamado "TDbf". TDbf Website). Soporta varios formatos DBase y Foxpro.

TFbg no acepta mandatos SQL pero permite utilizar los métodos dataset, etc y también utilizar controles databound (asociados a datos) regulares como puede ser DBGrid. No requiere ningún tipo de motor de bases de datos para funcionar. También hay que recalcar que no es la mejor opción a escoger cuando la aplicación va a manejar grandes bases de datos.

Ver la página de tutorial TDbf además de la documentación específica.

Se puede utilizar e.g. OpenOffice/LibreOffice Base para crear/editar visualmente este tipo de ficheros.


Cuando se ejecuta este código se crea una tabla con los datos de una colección de DVD's. Después de esto, todos los componentes data aware enlazados a través de TDataSource permitirá acceder a los datos de la tabla facilmente.

Utilizando TSdfDataset y TFixedDataset

TSdfDataset y TFixedDataset son dos simples datasets que ofrecen un formato textual simple de almacenamiento.

Estos datasets son muy convenientes para pequeñas bases de datos, porque están completamente implementados en una unidad Object Pascal y por tanto no requiere de liberías externas y porque su formato textual permite que sean editados facilmente con un editor de texto.


Note: En diciembre de 2012/FPC 2.7.1: SDFDataset se supone que puede ya leer y escribir ficheros CSV (Comma Separated Values) de acuerdo con RFC4180, pero todavía tiene algunos problemas con quoted fields, etc. Para más detalles ver CSV.

Para comenzar con este formato se debe crear un fichero de base de datos inicial. El formato es muy simple por lo que puedes utilizar un editor de texto para ello.

El ejemplo que sigue es una base de datos para TSdfDataset. Hay que fijarse en que la primera línea tiene los nombres de cada campoy que se utilizan comas como separadores o delimitadores.

ID,NAMEEN,NAMEPT,HEIGHT,WIDTH,PINS,DRAWINGCODE
1,resistor,resistor,1,1,1,LINE
2,capacitor,capacitor,1,1,1,LINE
3,transistor npn,transistor npn

Este es un ejemplo de base de datos utilizado con TFixedDataset.Cada registro ocupa una cantidad fija de espacio y ,si el campo es menor que el definido, deberían utilizarse espacios para rellenarlo a ese tamaño.

Name = 15 chars; Surname = 15 chars; Tell = 10 chars; e_mail = 20 chars;
Piet           Pompies                  piet@pompies.net

Utilizando datasets directamente

Algunas veces resulta útil crear un dataset y trabajar con el completamente a nivel de código. Para lograr esto tenemos el siguiente ejemplo que permite hacer precisamente esto. Fíjate en algunas de las peculiaridades de TSdfDataset/TFixedDataset:

  • Las líneas en la base de datos pueden tener un tamaño máximo de 300. Se está preparando una solución para esto.
  • Es necesario añadir las definiciones de campo. Algunos datasets son capaces de rellenar esta información por si solos desde el fichero de base de datos.
  • Se debe establecer FirstLineAsSchema a true, para inidcar que la primera línea incluye los nombres y posiciones del campo.
  • La propiedad Delimiter (delimitador) contiene el separador para los campos. Dicho separador no podrá ser utilizado como carácter en las cadenas de la base de datos. Similarmente no será posible tener fines de línea en la base de datos porque marcan el cambio entre registros. Es posible salvar este inconveniente sustituyendo la coma que se necesita o el final de línea con cualquier otro carácter que sea poco o nada utilizado como puede ser el caso del carácter #. Por ello cuando se muestran los caracteres por pantalla todos los caracteres # pueden convertirse a finales de línea y a la inversa cuando se almacenan datos de nuevo en la base de datos. La rutina de reemplazado de cadena (ReplaceString) resulta útil para esto.
uses sdfdata, db;
 
constructor TComponentsDatabase.Create;
var
  FDataset: TSdfDataset;
begin
  inherited Create;
 
  FDataset := TSdfDataset.Create(nil);
  FDataset.FileName := vConfigurations.ComponentsDBFile;
 
  // No necesariamente con TSdfDataset
  // FDataset.TableName := STR_DB_COMPONENTS_TABLE;
  // FDataset.PrimaryKey := STR_DB_COMPONENTS_ID;
 
  // Añade definiciones de campo.
 
  FDataset.FieldDefs.Add('ID', ftString);
  FDataset.FieldDefs.Add('NAMEEN', ftString);
  FDataset.FieldDefs.Add('NAMEPT', ftString);
  FDataset.FieldDefs.Add('HEIGHT', ftString);
  FDataset.FieldDefs.Add('WIDTH', ftString);
  FDataset.FieldDefs.Add('PINS', ftString);
  FDataset.FieldDefs.Add('DRAWINGCODE', ftString);
 
  // Necesario para TSdfDataset
  FDataset.Delimiter := ',';
  FDataset.FirstLineAsSchema := True;
  // Necesario para TSdfDataset
  FDataset.Delimiter := ',';
  FDataset.FirstLineAsSchema := True;
 
  FDataset.Active := True;
 
  // Establece el registro inicial
  CurrentRecNo := 1;
  FDataset.First;
end;

Cuando se utilice directamente TSdfDataset hay que prestar atención a RecNo, a pesar de que está implementado, no funciona en el sentido de moverse a través del dataset pero si leyendo y escribiendo registros. Las rutinas de navegación estandar tales como First, Next, Prior y Last funcionan como es de esperar por lo que no hay necesidad de utilizar RecNo en su lugar. Si sueles utilizar números absolutos de registro para navergar por la base de datos no hay problema en que implementes tu propia versión de RecNo. Para ello hay que declarar una variable global del tipo longint llamada CurrentRecNo, la cual contendrá el valor actual de RecNo. Recuerda que esta variable tendrá la misma convención que RecNo, por lo que el primer registro tendrá el número 1 (no es de base 0). Después de activar la base de datos se inicializa la base de datos al primer registro con TSdfDataset.First y establecer CurrentRecNo := 1

{@@
  Mueve al registro deseado utilizando TDataset.Next y TDataset.Prior
  Esto evita el uso de TDataset.RecNo el cual no navega fiablemente
  por el dataset.
 
  @param AID indica el número de registro. El primer registro tiene
  el número 1 (no empieza por cero).
}
procedure TComponentsDatabase.GoToRec(AID: Integer);
begin
  // Estamos antes del registro deseado, avanzar.
  if CurrentRecNo < AID then
  begin
    while (not FDataset.EOF) and (CurrentRecNo < AID) do
    begin
      FDataset.Next;
      FDataset.CursorPosChanged;ID: Integer);
begin
  // Estamos antes del registro deseado, avanzar.
  if CurrentRecNo < AID then
  begin
    while (not FDataset.EOF) and (CurrentRecNo < AID) do
    begin
      FDataset.Next;
      FDataset.CursorPosChanged;
      Inc(CurrentRecNo);
    end;
  end
  // Estamos después del registro deseado, retroceder
  else if CurrentRecNo > AID  then
  begin
    while (CurrentRecNo >= 1) and (CurrentRecNo > AID) do
    begin
      FDataset.Prior;
      FDataset.CursorPosChanged;
      Dec(CurrentRecNo);
    end;
  end;
end;

Utilizando controles data-aware

Lazarus y Advantage Database Server

Ver además

(Ordenados alfabéticamente)