divendres, 13 d’agost del 2010

Com accedir a SQLite amb Lazarus / 27 juliol 2010

Com accedir a SQLite amb Lazarus

Aquest post és una rèplica de l'anterior, però canviant d'eina RAD. En aquest cas faig servir Lazarus que és una IDE d'aspecte similar al Delphi.

Lazarus funciona com una IDE de desenvolupament ràpid basat en components que fa servir el llenguatge Free Pascal (mireu també el site oficial)

Lazarus i Free Pascal es poden instal·lar directament des del  Centre de Programari de l'Ubuntu (jo faig servir una Ubuntu 10.04 - Lucid Lynx).

Tanmateix, amb la instal·lació per defecte, el component de connexió al SQLite  ve precarregat però no està activat. Cal anar a Package - Paquets instal·lats i allà triar en la caixa de paquets disponibles (la de la dreta) el paquet sqlite3laz 0.4 i prémer  el botó per desar i remuntar l'IDE. Amb això disposaré a la pestanya Data Access d'un component DataSet de connexió a bases de dades del tipus SQLite3. Podria triar un component de connexió a bases  de dades SQLite2, però no semblen conviure bé.

El que faré serà el mateix que en el post anterior:

Creo una base de dades SQLite 3. Aquest cop puc fer servir SQLite Database Browser, per exemple o bé la el client  en mode text (a la consola escriu sqlite3, si només poso sqlite se m'activa el client d'SQLite2).

Creo una taula taula1, amb tres camps: id (integer i PK), valor (varchar de 20) i traducció (varchar de 20)

Pel que he vist, Es necessari que el fitxer de base de dades tingui permisos 777. A més també cal que tingui permisos de lectura i escriptura la carpeta on s'ubica el fitxer de base de dades.

A continuació creo un formulari al que incorporo un SQLite3Dataset i un Datasource.
A les propietats del dataset indico:
Filename:  /home/albert/databases/sqlite3/prova-sqlite2/prova2.db3
TableName: taula1 (que és el mateix que posar a la propietat SQL: Select * from taula1;
i activo

Al Datasource li poso a la propietat Dataset el nom del component SQLite3Dataset

A continuació completo el formulari amb els botons Mostrar, Netejar i Sortir i un camp memo (que és l'equivalent a la textbox multilinea del VB). El funcionament dels botons es:
Mostrar: carrega les dades de la taula i les mostra al camp memo.
Netejar: esborra el camp memo.
Sortir: atura l'aplicació.

Per exemple, una cosa així:


El codi de la unitat queda de la següent forma:



unit unProvaSQLite3_03;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Sqlite3DS, db, odbcconn, sqldb, sqlite3conn, FileUtil,
  LResources, Forms, Controls, Graphics, Dialogs, DbCtrls, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Datasource1: TDatasource;
    Memo1: TMemo;
    Sqlite3Dataset1: TSqlite3Dataset;
    Sqlite3Dataset1id: TLongintField;
    Sqlite3Dataset1traduccio: TMemoField;
    Sqlite3Dataset1valor: TMemoField;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{ TForm1 }

procedure TForm1.Button3Click(Sender: TObject);
begin
  Application.Terminate;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  { ShowMessage('esborra'); }
  Memo1.Clear;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  sId,sValor,sTraduccio: String;
  sLinea: String;
begin
  Sqlite3Dataset1.Open;
  Sqlite3Dataset1.First;
  while not Sqlite3Dataset1.EOF do begin
    sId := Sqlite3Dataset1id.AsString;
    sValor := Sqlite3Dataset1valor.AsString;
    sTraduccio := Sqlite3Dataset1traduccio.AsString;

    sLinea := sId  + '; ' + sValor + '; ' + sTraduccio;
    Memo1.Append(sLinea);
    Sqlite3Dataset1.Next;
  end;
 
Sqlite3Dataset1.Close;
end;

initialization
  {$I unprovasqlite3_03.lrs}

end.



El més interessant és el mètode del botó mostrar (el procedure TForm1.Button1Click)

Obrim el dataset
Sqlite3Dataset1.Open;

anem al primer element del dataset
Sqlite3Dataset1.First;

mentre no arribem a la fi del dataset fem
while not Sqlite3Dataset1.EOF do begin

agafaem els valors dels camps de la fila actual del dataset. A diferència del Gambas, cada camp del dataset ha de tenir un objecte que el representi explícitament. El valor es torna com cadena per a facilitar-ne el tractament però hi han mètodes específics per aretornar int, long...
    sId := Sqlite3Dataset1id.AsString;
    sValor := Sqlite3Dataset1valor.AsString;
    sTraduccio := Sqlite3Dataset1traduccio.AsString;


formata una línia per mostrar amb els valors dels camps
sLinea := sId  + '; ' + sValor + '; ' + sTraduccio;

afegeix la línia al camp memo
Memo1.Append(sLinea);

avança a la següent fila del dataset
Sqlite3Dataset1.Next;

I quan ha recorregut tot el dataset, el tanca.
Sqlite3Dataset1.Close;

Aquest és el HelloWorld de Lazarus + SQLite.

Cap comentari:

Publica un comentari a l'entrada