Databases/es

From Free Pascal wiki
Revision as of 22:29, 9 November 2011 by Iskraelectrica (talk | contribs)
Jump to navigationJump to search

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

Trabajo en curso...

Artículos de programación de Bases de Datos

Referencias:

Tutoriales / artículos prácticos:

Introducción

   Esta página será una introducción al tema "Lazarus y las bases de datos. La tabla que sigue proporciona una visión general sobre las bases de datos soportadas. Es necesario actualizarla en breve, ya que se basa en el momento en que FPC 1.9.7 fue liberado. Advertencia: Sólo debe instalar los componentes de base de datos para los que ha instalado las librerías cliente, si la base de datos necesita de ellas; de lo contrario Lazarus podría no iniciarse debido a que faltan archivos. A continuación, no tendrías más remedio que volver a instalar Lázaro, porque desinstalar el componente no es posible. (En realidad no es tan grave, hay una alternativa: borrar el nombre del paquete o paquetes del archivo staticpackages.inc -en las últimas versiones este archivo se crea a partir del contenido de miscellaneousoptions.xml, y es este el archivo que hay que editar- y compilar el IDE desde la línea de órdenes con lazbuild --build-ide=)

Bases de Datos soportadas

Base
de Datos
Nombre
Paquete
¿Necesita
librerías?
¿Necesita
servidor?
Versiones
compatibles
Plataformas
compatibles
Textfiles sdf No No - Todas
In memory memds No No - Todas
In memory bufdataset No No - Todas
DBase DBFLaz No No III+, IV, VII Todas
FoxPro DBFLaz No No 2.0, 2.5, 3.0 (parcial) Todas
Paradox TParadoxDataSet No No hasta tablas de nivel 7 (¿y más ?) Todas
SQLite SQLite No - i386: Linux, Win32
MySQL SQLdb 3.0 - 5.1 i386: Linux, Win32
Firebird IBase 1 - 2.0 i386: Linux, Win32
Interbase SQLdb Yes Yes 4 - 6 i386: Linux, Win32
PostgreSQL SQLdb 6.6 - 8 i386: Linux, Win32
ODBC SQLdb Según SGDB 3.x 1) i386: Linux, Win32
Oracle SQLdb - -

1) Se puede utilizar una versión embebida de Firebird en Windows al menos (posiblemente en Linux / OSX con algunas modificaciones), o puede conectarse a un servidor Firebird que corre en Windows/Unix/OSX/FreeBSD/y otras plataformas soportadas por Firebird

   2) Este número de versión se refiere al estándar ODBC, no al número de versión de un controlador o un gestor de controladores. Hay controladores ODBC 3.x para la mayoría de los DBMS.

Los enlaces con los clientes de base de datos

   Si deseas utilizar una de las librerías cliente de bases de datos, las librerías tienen que estar instaladas,no sólo en el equipo en que se programa, sino también en los equipos en que sen ejecutará la aplicación. Ten en cuenta que algunas bases de datos (MySQL, en particular) sólo funcionará si los enlaces usados al compilar la aplicación son de la misma versión que los de las librerías instaladas. Puedes averiguar cómo instalar las librerías (archivos .so en sistemas *nix, y .dll en windows) en la página web de los desarrolladores de la base de datos. Las unidades de enlace se pueden encontrar en los directorios base de los paquetes base en el fuente FPC. Básicamente consisten en llamadas al API de cliente como mysql_connect_database, que son completamente diferentes para cada base de datos. Es posible escribir aplicaciones de base de datos con estas unidades, pero por lo general es mucho más trabajo y propenso a errores quee utilizar los componentes dela unidad DB de Lazarus.

   La mayoría de estos paquetes de enlace están muy vinculadas a la librería clientes. Esto implica que si la aplicación se compila con una de estas unidades, toda la aplicación no podrá enlazarse si las librerías cliente no están disponibles en el equipo. Esto significa que, si no tienes instalado -por ejemplo- MySQL en el equipo, y si estás usando la unidad mysql4.pp en tu programa, el programa no se enlazará.    Si tienes éxito al compilar el programa en un equipo que tiene instalado MySQL, ni siquiera se iniciará en otra máquina sin las librerías MySQL adecuadas.    En otras palabras: para estas bases de datos, es necesario instalar las librerías de cliente en el equipo de desarrollo, y es necesario instalar estas bibliotecas de cliente con tu aplicación.

   Para evitar estos problemas algunos de los paquetes también son capaces de enlazar dinámicamente las librerías. Antes de hacer cualquier llamada a la librería, la unidad debe ser 'iniciada'. Este inicio falla si la base de datos de cliente no está instalada en el equipo. Al terminar de utilizar las librerías cliente el programa estas tienen que ser "liberadas".

Conjuntos de datos (Datasets)

   La utilización de bases de datos en Lazarus (o FreePascal) se basa fundamentalmente en la clase TDataset. Esta representa una tabla o consulta de tu aplicación. Sin embargo, al igual que con muchas otras clases fundamentales, no se utiliza la clase TDataset en sí, se utiliza una derivada de ella. Hay muchas de estas, que proporcionan acceso a los diferentes tipos de bases de datos, como archivos locales dBase o de texto, o en servidores tales como bases de datos PostgreSQL, Firebird, MySQL, etc. Algunos descendientes de DataSet son una conexión directa a las tablas de base de datos, mientras que otros utilizan componentes o bibliotecas para llevar a cabo la conexión

   Los descendientes de TDataSet, son componentes no visuales y forman (en general) parte de la Librería de Componentes Libre (FCL) en lugar de la Librería de Componentes de Lazarus (LCL)

   Los conjuntos de datos (DataSet) se puede utilizar mediante programación y con los controles visuales. En una aplicación típica de base de datos de Lazarus a menudo se utilizan ambos métodos. En cualquier caso, el primer paso es crear el descendiente TDataset, iniciar su conexión a la tabla o consulta que desee, y abrirlo. Esto se puede hacer ya sea en el código, en tiempo de ejecución, o situando un componente en su formulario y configurando sus propiedades en tiempo de diseño. Los detalles de este proceso varían considerablemente con cada diferente descendiente de TDataset, así que consulta las distintas guías en Bases de datos por ver lo que tienes que hacer de tu base de datos.

   Cuando el DataSet se crea un conjunto de componentes de campo, uno para cada campo o columna de la tabla o consulta que se abrió. Cada componente de campo es un descendiente de TField, apropiado para el tipo de datos en particular del campo.

Using datasets from code

Programmatic access will be explained in more detail in Using Dataset and Field components, but as a very simple overview:

  • Use the TDataset descendant to open the table or query, filter the rows you want to see, and to move from row to row.
  • Use the TField descendants to:
    • Access general information about fields
    • Access the specific data values for the current row. (use the As... properties, such as AsString, AsInteger, etc.)
  • Access the fields of a TDataset descendant by using either:
    • The fields property, eg Fields[0] is the first field,
    • The FieldByName method, eg FieldByName('AGE') returns the field associated with the database field called 'AGE'

See Database_field_type for a list of field types.

Using the visual (data-aware) controls

To use databases in a simple, "RAD" style Lazarus application, you usually configure the dataset descendant at design time and the use the data-aware controls. To do this:

  • Add the dataset descendant for the database of your choice, together with any supporting components, to your form, and open it (Set the 'Active' property to true)
  • Add a TDatasource component (from the "Data Access" tab) to the form, and "link" it to the dataset (set the DataSet property)
  • Add data-aware controls from the "Data Controls" tab to the form, and link each one to the DataSource (not dataset) component
  • Most controls link to a single field, so you also need to set the Field for each tab.

See #Data Controls below for more details on the controls

Dataset State

Datasets can be in a number of states. While there are quite a few (look up TDataSetState in the source), the main ones to be aware of initally are

State Function
dsInactive The dataset is closed
dsBrowse The user can browse through the dataset, looking at values
dsEdit The user can edit values on the current row. Values are not saved until a post is performed.
dsInsert A new row has been added, and the user can set the values. The record is not saved until a post is performed

The other states are fairly transitory, and are usually handled "automatically". They are used internally and in more complicated code. If your database only views data, and you open the dataset at design time, you can largely ignore the state, as it will mostly be dsBrowse. However, most applications will want to change the data at some stage. If you are using data-aware controls, they will handle a lot of this automatically. If you change the text in a DBEdit control, for example, it will put the dataset into dsEdit state - unless you are already in dsEdit or dsInsert. If you "scroll" to a different record while the current state is dsEdit or dsInsert, that record will be "posted" and the dataset revert to dsBrowse. However, if you are accessing the dataset from code, you will often have to change the state in code as well. The dbNavigator control (see below) allows the user to change the state explicitly.

Post and Cancel

If you have edited or inserted a record, the new values are held in a buffer.

  • Calling the dataset cancel method removes the new record (insert) or reverts the values to their previous values (edit).
  • Calling the dataset post method saves the values (edit) or record (insert). In some dataset descendants, they will be written to the database immediately, while in others they will be stored in a list of updates until a further call is made to save all changes to the database. Finally, even when they are written to the database, you may still have to call a "commit" method to make the database write them permanently. All of this also varies considerably with the dataset descendant, so look up the details for the one you are using.

Inserting a new record

To insert a new record into a TDataset descendent, one should use the method Insert. After that one can set the field values and then finally call Post to commit the new record, as the example below shows:

<delphi> MyDataset.Insert;

MyDataset.Fields[0].AsInteger := 4;
MyDataset.Fields[1].AsString := 'First Name';
MyDataset.Post;</delphi>

How to quickly jump to 1 particular record in the table

After selecting all records of the table

If you use SELECT * FROM to select all records of the table and then desires to quickly jump between them, you will have to build an index and search on it. It is more efficient to select only the record that you want.

Selecting only the desired record

One fast solution to jump to a particular record is to select only it, for example doing:

<delphi> var

MyDataset: TSQLQuery;
begin
 //...
 MyDataset.FieldDefs.Add('SessionId', ftLargeint);
 MyDataset.FieldDefs.Add('GameEvent', ftLargeint);
 MyDataset.FieldDefs.Add('TableId', ftInteger);
 MyDataset.FieldDefs.Add('LoggedIn', ftBoolean);
 MyDataset.FieldDefs.Add('PlayerId', ftInteger);
 MyDataset.Active := False;
 SQLText := Format('select * from "GameSession" WHERE "SessionId"=%d', [ASessionId]);
 MyDataset.SQL.Text := SQLText;
 try
   MyDataset.Active := True;
 except
   //...
end;</delphi>

You can then read information using something like this:

<delphi> lPlayerId := MyDataset.Fields[4].AsInteger;</delphi>

Using TSQLQuery

For more information about TSQLQuery see Working With TSQLQuery

Data Controls

To use any of these controls, add the control to a form and set at least the datasource property. Other key properties will be noted.

Single Field Controls

These controls all attach to a single field. As well as datasource, set the field name. Controls include:

DBGrid control

This control can show a number of fields in a row/column layout - in fact by default it shows them all. However, you can put entries into the columns collection to restrict it to specific fields and to set the widths and titles of each column.

Navigator Control

This control gives the user some direct control over the dataset. It allows the user to:

  • Move to the next or previous record, or to the start or end of the records
  • Add a new record (equivalent to a dataset.insert method call)
  • Put the dataset into edit mode
  • Delete a record
  • Post or Cancel current changes
  • Refresh the data (useful in multiuser database applications)

Key Properties:

  • VisibleButtons: Lets you control what the user can do. For example, if deletes are not allowed, hide the delete button. If you have a DBGrid attached to the same dataset, you may decide you do not need the next and prior buttons.
  • Width: If you do not show all buttons, you may want to set the width to (height*number_of_visible_buttons)

Running FPC database tests

FreePascal database components include a test framework that can be used to verify functionality. See the directory source\packages\fcl-db\tests\ in your FPC source tree. Included is a test framework that can be run on various database components, as well as some other tests (e.g. test of database export in XMLXSDExportTest.lpr).

To run the test framework on a certain database:

1. Save source\packages\fcl-db\tests\database.ini.txt as source\packages\fcl-db\tests\database.ini

2. Modify source\packages\fcl-db\tests\database.ini to choose which database type you will use.

Example: use Interbase or Firebird: [Database] type=interbase

3. In the same file, customize settings for your database. E.g. if you chose interbase before:

[interbase] connector=sql connectorparams=interbase

name of the database. obviously change to your own playground database

name=testdb user=sysdba password=masterkey

your hostname may very will differ to

hostname=192.168.0.42

4. Compile and run source\packages\fcl-db\tests\dbtestframework.pas The output will be in XML format.

Please see source\packages\fcl-db\tests\README.txt for more details.

Paquetes de Bases de Datos suministrados con Lazarus

sqldblaz.lpk

   Este paquete provee acceso a diferentes bases de datos. Incluye:

  • Interbase/Firebird
  • MySQL
  • Oracle
  • PostgreSQL
  • SQLite
  • any database that has an ODBC driver.

   Los componentes (TSQLQuery, TSQLTransaction, TIBConnection, TODBCConnection, TOracleConnection, TMySQL40Connection, TMySQL41Connection, TMySQL50Connection, TPQConnection) se encuentran en la pestaña 'SQLdb' en la paleta de componentes.

dbflaz.lpk

   Este paquete provee acceso a las bases de datos dBase y FoxPro.Puedes obtener más información en la Tutoría de Lazarus Tdbf. El componente TDbf se localiza en la pestaña 'Data Access' en la paleta de componentes.

sqlitelaz.lpk

   Este paquete provee acceso a las bases de datos SQLite. Puedes obtener más información en la Tutoría de Bases de Datos Lazarus.

sdflaz.lpk

   El componente TSdfDataSet se encuentran en la pestaña 'Data Access' en la paleta de componentes.

lazreport.lpk

   La página principal del generador de informes es http://lazreport.sourceforge.net/. Más información y enlaces adicionales se encuentran en aquí. LazReport depende del paquete Printer4Lazarus. Con la revisión 11950 LazReport fué incluido el repositorio SVN de Lazarus.

Paquetes y librerías externas

Zeos DataBase Objects

   Los componentes de este paquete proveen acceso a diferentes bases de datos. Puedes obtener más información aquí. Este wiki contiene una tutoría Zeos.

Pascal Data Objects

Ahora hay una alternativa.

Soporta:

  • MySQL 4.1 y 5.0
  • sqlite-2 y sqlite-3
  • pgsql-8.1
  • interbase-5, interbase-6, firebird-1.0, firebird-1.5, firebird-1.5E, firebird-2.0, firebird-2.0E
  • mssql (librería Microsoft) y sybase (librería FreeTDS)
  • oracle
  • así como sentencias preparadas, enlace, y procedimientos almacenados son soportados por la API de base de datos llamada Pascal Data Objects, que se inspira en PHP Data Objects. Todo el código y la documentación necesaria para utilizar esta nueva API está disponible en aquí en Sourceforge:

TPSQL

   Los componentes de este paquete proveen acceso vía TCP/IP a bases de datos PostgreSQL. Puedes obtener más información en esta página.

FIBL

   Los componentes de este paquete proveen acceso a bases de datos Interbase y Firebird. La página principal está aquí.

FBLib Firebird, librería

   FBLib es una librería de fuente abierta sin componentes ligados a datos (No Data Aware) para acceso directo a bases de datos relacionales Firebird desde Borland Delphi/Kylix, Free Pascal y Lazarus.

   Las características actuales incluyen:

  • Acceso directo a to Firebird 1.0.x, 1.5.x y 2.x Classic o SuperServer
  • Multiplataforma [Win32,Gnu/Linux,FreeBSD)
  • Selección automática de la librería cliente 'fbclient' o 'gds32'
  • Consultas con parámetros
  • Soporte del dialecto SQL 1/3
  • Acuerdo de Licencia LGPL
  • Extracción de Metadata
  • Analizador simple de secuencias de comandos
  • Únicamente añade 100-150 KB al EXE final
  • Soporta campos BLOB
  • Exporta datos a HTML SQL Script
  • Administrador de servicios (copia de seguridad, restauración,gfix...)
  • Eventos de alerta

   Puedes descargar la documentación desde el sitio web FBLib's.

Unified Interbase

   UIB provee acceso a bases de datos Interbase, Firebird y YAFFIL. TLa página principal es www.progdigy.com. Un repositorio SVN está disponible aquí .

TechInsite Object Persistence Framework (tiOPF)

   Más información acerca de tiOPF se puede encontrar en esta página.