Difference between revisions of "Lazarus Database Tutorial/nl"

From Lazarus wiki
Jump to navigationJump to search
 
(10 intermediate revisions by 4 users not shown)
Line 1: Line 1:
 +
{{Lazarus Database Tutorial}}
 +
 
== Overzicht ==
 
== Overzicht ==
  
 
Deze paragraaf laat zien hoe je Lazarus kunt gebruiken met verschillende databases.
 
Deze paragraaf laat zien hoe je Lazarus kunt gebruiken met verschillende databases.
Zoals je ziet zijn nog niet alle databases gedekt, dus ... help mee om dit deel uit te breiden.
+
Zoals je ziet zijn nog niet alle databases gedekt, dus... help mee om dit deel uit te breiden.
  
 
== Lazarus en MySQL ==
 
== Lazarus en MySQL ==
Line 12: Line 14:
  
 
=== MySQL werkend krijgen met FPC in een terminal ===
 
=== MySQL werkend krijgen met FPC in een terminal ===
In de directory $(FreePascal_directory)/packages/base/mysql/ staat een voorbeeld programma. Deze directiry bevat ook de units mysql.pp, mysql_com.pp and mysql_version.pp. Voordat je het test script uitvoert, moet je een database genaamd "testdb" aanmaken. Dit kun je doen door in te loggen met behulp van de mysql monitor (als root met alle rechten) en het volgende SQL statement uit te voeren.
+
In de directory $(FreePascal_directory)/packages/base/mysql/ staat een voorbeeld programma. Deze directory bevat ook de units mysql.pp, mysql_com.pp and mysql_version.pp. Voordat je het test script uitvoert, moet je een database genaamd "testdb" aanmaken. Dit kun je doen door in te loggen met behulp van de mysql monitor (als root met alle rechten) en het volgende SQL statement uit te voeren.
 
  CREATE DATABASE testdb;
 
  CREATE DATABASE testdb;
zorg er dan voor dat alle gebruikers voldoende rechten hebben door  
+
zorg er dan voor dat alle gebruikers voldoende rechten hebben door commando's zoals het volgende:
 
  GRANT ALL ON testdb TO johnny-user IDENTIFIED BY 'johnnyspassword';  
 
  GRANT ALL ON testdb TO johnny-user IDENTIFIED BY 'johnnyspassword';  
uit te voeren. Er is script genaamd mkdb, dat je nu moet uitvoeren:
+
uit te voeren. Er is een script genaamd mkdb, dat je nu moet uitvoeren:
 
  sh ./mkdb
 
  sh ./mkdb
Waarschijnlijk mislukt dit omdat het systeem niet toestaat dat een anonieme gebruiker de database benaderd. Wijzig het script nu zo dat de regel die mysql start er zo uit ziet:
+
Waarschijnlijk mislukt dit omdat het systeem niet toestaat dat een anonieme gebruiker de database benadert. Wijzig het script nu zo dat de regel die de mysql client het script laat starten er zo uit ziet:
 
  mysql -u root -p  ${1-testdb} << EOF >/dev/null
 
  mysql -u root -p  ${1-testdb} << EOF >/dev/null
en probeer het script nogmaals uit te voeren, waarbij het het root paswoord invult op de prompt. Met een beetje geluk heb je nu de test database gemaakt. Controleer dit door het volgende mysql statement uit te voeren, vanuit je mysql monitor:  
+
en probeer het script nogmaals uit te voeren, waarbij je het root paswoord invult op de prompt. Met een beetje geluk heb je nu de test database gemaakt. Controleer dit door het volgende mysql statement uit te voeren, vanuit je mysql monitor:  
 
  select * from FPdev;
 
  select * from FPdev;
Als het goed is zie je nu een tabel met de ID, username en email adressen van een paar van FPC ontwikkelaars.
+
Als het goed is zie je nu een tabel met de ID, username en email adressen van een paar van de FPC ontwikkelaars.
  
 
Probeer nu het testprogramma testdb.pp uit te voeren. (Waarschijnlijk moet dit eerst nog gecompileerd worden en zal het de eerste keer niet lukken om het succesvol uit te voeren!!)
 
Probeer nu het testprogramma testdb.pp uit te voeren. (Waarschijnlijk moet dit eerst nog gecompileerd worden en zal het de eerste keer niet lukken om het succesvol uit te voeren!!)
Line 28: Line 30:
 
Er kunnen een aantal redenen zijn waarom het programma geen verbinding kan maken met de mysql server:
 
Er kunnen een aantal redenen zijn waarom het programma geen verbinding kan maken met de mysql server:
  
* Het systeem (SuSE Linux v9.0) installeert mysql v4.0.15 en niet de versie 3 waarvoor het package is ontworpen.   
+
* Het systeem installeert een andere versie, bijv. mysql v4.0.15 en niet de versie 3 waarvoor het package is ontworpen.   
  
* Het programma heeft een gebruikersnaam en paswoord nodig om de database te benaderen.
+
* Het programma heeft een geldige mysql gebruikersnaam en wachtwoord nodig om de database te benaderen.
  
 
* De compiler moet weten waar het de mysql libraries kan vinden. (ALS JE DE MYSQL ONTWIKKEL LIBRARIES NOG NIET HEBT GEÏNSTALLEERD, DOE DAT DAN NU!)
 
* De compiler moet weten waar het de mysql libraries kan vinden. (ALS JE DE MYSQL ONTWIKKEL LIBRARIES NOG NIET HEBT GEÏNSTALLEERD, DOE DAT DAN NU!)
Line 45: Line 47:
 
Controleer wel even de naam van jouw libraries. Voor de zekerheid kun je ook de volgende link aanmaken
 
Controleer wel even de naam van jouw libraries. Voor de zekerheid kun je ook de volgende link aanmaken
 
  ln -s libmysqlclient.so.12.0.0 mysqlclient
 
  ln -s libmysqlclient.so.12.0.0 mysqlclient
Sommige moeten misschien de volgende link opnemen:
+
Sommigen moeten misschien de volgende link opnemen:
 
  ln -s libmysqlclient.so.12.0.0 libmysqlclient.so
 
  ln -s libmysqlclient.so.12.0.0 libmysqlclient.so
  
Line 108: Line 110:
 
YES! Je hebt een lijst van FPC ontwikkelaars!
 
YES! Je hebt een lijst van FPC ontwikkelaars!
  
Een paar mogelijke verbeteringen: Je kunt de invoer van de gebuiker gegevens en the SQL commando's interactief maken. Hiervoor worden variabelen gebruikt in plaats van constanten. Er kunnen SQL commando's ingevoerd worden totdat het commando 'quit' wordt ingevoerd. Zie de [[Lazarus Database Tutorial/TryDbpp|volledige listing]]. In deze versie worden de gerbuikers gegevens in the console ingevoerd, waarna het programma in een loop komt waarbij SQL commando's kunnen worden ingevoerd en de resultaten worden getoond. Het programma eindigt als 'quit' wordt ingevoerd.
+
Een paar mogelijke verbeteringen: Je kunt de invoer van de gebruiker gegevens en de SQL commando's interactief maken. Hiervoor worden variabelen gebruikt in plaats van constanten. Er kunnen SQL commando's ingevoerd worden totdat het commando 'quit' wordt ingevoerd. Zie de [[Lazarus Database Tutorial/TryDbpp|volledige listing]]. In deze versie worden de gebruikers gegevens in de console ingevoerd, waarna het programma in een loop komt waarbij SQL commando's kunnen worden ingevoerd en de resultaten worden getoond. Het programma eindigt als 'quit' wordt ingevoerd.
  
 
Zie ook [[Lazarus Database Tutorial/SampleListing|Sample Console Listing]].
 
Zie ook [[Lazarus Database Tutorial/SampleListing|Sample Console Listing]].
Line 121: Line 123:
 
Vergroot het form zodat het ongeveer 600 bij 800 is. Geef het form een nieuwe naam en wijzig de caption in 'TryMySQL'.
 
Vergroot het form zodat het ongeveer 600 bij 800 is. Geef het form een nieuwe naam en wijzig de caption in 'TryMySQL'.
  
Van de Standard Componenten tab plaats je drie Editboxes in de linker bovenhoek van het Form, en plaats direct boven elke editbox labels.  Wijzig de en captions en namen in 'Host' (en HostLabel,HostEdit), 'UserName' (en UserLabel, UserEdit) en 'Password' (with PasswdLabel and PasswdEdit). Je kunt natuurlijk ook gebruik maken van de LabelledEdit componenten van de Additional tab.
+
Van de Standard Componenten tab plaats je drie Editboxes in de linker bovenhoek van het Form, en plaats direct boven elke editbox labels.  Wijzig de captions en namen in 'Host' (en HostLabel,HostEdit), 'UserName' (en UserLabel, UserEdit) en 'Password' (met PasswdLabel en PasswdEdit). Je kunt natuurlijk ook gebruik maken van de LabelledEdit componenten van de Additional tab.
  
Selecteer de Passwd Editbox en zoek het PasswordChar property: wijzig dit in * , zodat wanneer je hier een paswoord intypt de letters niet getoond worden maar een serie van *-en. Zorg er voor dat de Text properties van alle editbox-en leeg zijn.
+
Selecteer de Passwd Editbox en zoek de PasswordChar property: wijzig dit in * , zodat wanneer je hier een paswoord intypt de letters niet getoond worden maar een serie van *-en. Zorg er voor dat de Text properties van alle editbox-en leeg zijn.
  
Onder deze editbox plaatsen we een button. Zet het Caption hiervan op 'Connect to server' en geef het de naam 'ConnectButton'.  
+
Onder deze editbox plaatsen we een button. Zet de Caption hiervan op 'Connect to server' en geef het de naam 'ConnectButton'.  
  
 
Daarna zetten we een tweetal Comboboxen op het form met daarboven een Label. Deze noemen we DatabaseComboBox (en DatabaseLabel) en TableComboBox (en TableLabel). Tussen beide comboboxen plaatsen we nog een button, Caption = Select Database, Name = SelectDBButton.
 
Daarna zetten we een tweetal Comboboxen op het form met daarboven een Label. Deze noemen we DatabaseComboBox (en DatabaseLabel) en TableComboBox (en TableLabel). Tussen beide comboboxen plaatsen we nog een button, Caption = Select Database, Name = SelectDBButton.
Line 135: Line 137:
 
Plaats een grote Memo op het form genaamd 'Results' (ResultMemo) op de rechter onderkant, zodanig dat het het grootste deel van het form vult. Zet het ScrollBars property op ssAutoBoth zodat de scroll bars automatisch veschijnen als het memo wordt gevuld. Zet het WordWrap property op True.
 
Plaats een grote Memo op het form genaamd 'Results' (ResultMemo) op de rechter onderkant, zodanig dat het het grootste deel van het form vult. Zet het ScrollBars property op ssAutoBoth zodat de scroll bars automatisch veschijnen als het memo wordt gevuld. Zet het WordWrap property op True.
  
Plaats een Status Bar (van de Common Controls tab) aan de onderkant van het Form, en zet het SimpleText property op 'TryMySQL'.
+
Plaats een Status Bar (van de Common Controls tab) aan de onderkant van het Form, en zet de SimpleText property op 'TryMySQL'.
  
Een screenshot van het form kun je hier zien: [http://lazarus-ccr.sourceforge.net/kb/index.php/Image:Trymysql.png Mysql Example Screenshot]
+
Een screenshot van het formulier kun je hier zien: [http://lazarus-ccr.sourceforge.net/kb/index.php/Image:Trymysql.png Mysql Example Screenshot]
  
 
Nu moeten we nog de code (een aantal event handlers) schrijven.
 
Nu moeten we nog de code (een aantal event handlers) schrijven.
  
De drie Editbox-en aan de linker bovenkant worden gebruikt om de hostnaam, gebruikersnaam en het paswoord in te voeren. Wanneer deze zijn ingevuld kan er op de "Connect" button geklikt worden. De OnClick-event van deze button is gebaseerd op een deel van het FPC programma hierboven.
+
De drie Editboxen aan de linker bovenkant worden gebruikt om de hostnaam, gebruikersnaam en het wachtwoord in te voeren. Wanneer deze zijn ingevuld kan er op de "Connect" button geklikt worden. De OnClick-event van deze button is gebaseerd op een deel van het FPC programma hierboven.
  
 
Omdat we nu de antwoorden van de database server niet met Write of WriteLn kunnen tonen, zullen we deze in het Memo laten zien. Hiervoor is het wel noodzakelijk dat we deze resultaten omzetten naar strings. We maken hiervoor een methode van ons form die de strings in het memo plaatst.
 
Omdat we nu de antwoorden van de database server niet met Write of WriteLn kunnen tonen, zullen we deze in het Memo laten zien. Hiervoor is het wel noodzakelijk dat we deze resultaten omzetten naar strings. We maken hiervoor een methode van ons form die de strings in het memo plaatst.
Line 228: Line 230:
 
  end;
 
  end;
  
In de EditBox rechts bovenin het form kan dan een SQL commando worden ingevoerd (zonder afsluitende punt-komma). Als er op de OpenQuery button geklikt wordt, wordt het commando naar de server gestuurd en als er data te tonen zijn zal dat in een tweede form getoond worden.
+
In de EditBox rechts bovenin het form kan dan een SQL commando worden ingevoerd (zonder afsluitende punt-komma). Als er op de OpenQuery button geklikt wordt, wordt het commando naar de server gestuurd en als er data te tonen is, zal dat in een tweede form getoond worden.
  
 
Ook het OnClick-event van de OpenQuery-button is gebaseerd op de code van de FPC versie hierboven.
 
Ook het OnClick-event van de OpenQuery-button is gebaseerd op de code van de FPC versie hierboven.
  
Het OnCLick-event voor de OpenQuery-button is als volgt:
+
Het OnClick-event voor de OpenQuery-button is als volgt:
  
 
  procedure TFormTryMySQL.OpenQueryButtonClick(Sender: TObject);
 
  procedure TFormTryMySQL.OpenQueryButtonClick(Sender: TObject);
Line 295: Line 297:
 
  end;
 
  end;
  
Er zijn nog drietal andere event-handlers geschreven. Een voor het OnClose-event van het form en voor de OnChange-events van beide ComboBoxen.
+
Er zijn nog een drietal andere event-handlers geschreven. Eén voor het OnClose-event van het form en voor de OnChange-events van beide ComboBoxen.
  
 
In afwijking van het FPC programma, wordt het Lazarus programma niet afgebroken als er een fout optreedt. In plaats daarvan komt de controle weer terug bij het hoofd form (main form) en wordt de gelegenheid gegeven om het commando te verbeteren voordat het opnieuw wordt verstuurd naar de server.
 
In afwijking van het FPC programma, wordt het Lazarus programma niet afgebroken als er een fout optreedt. In plaats daarvan komt de controle weer terug bij het hoofd form (main form) en wordt de gelegenheid gegeven om het commando te verbeteren voordat het opnieuw wordt verstuurd naar de server.
Line 302: Line 304:
 
OK! Sla je project op en klik op Run -> Run
 
OK! Sla je project op en klik op Run -> Run
  
==== Download MYSQL Source Code ====
+
==== Download MySQL Source Code ====
Een volledige listing van het programma is hier te downloaden [http://prdownloads.sourceforge.net/lazarus-ccr/trymysql20050404.tar.gz?download Sample Source Code] Er staat meer commentaar in de sources, die de verschillende onderdelen toelichten.
+
Een volledige listing van het programma is hier te downloaden [http://prdownloads.sourceforge.net/lazarus-ccr/trymysql20050404.tar.gz?download Sample Source Code] Er staat meer commentaar in de sources, dat de verschillende onderdelen toelicht.
  
 
== Lazarus en Postgresql ==
 
== Lazarus en Postgresql ==
Line 315: Line 317:
 
===Introductie===
 
===Introductie===
  
Er zijn twee TDatasets afstammelingen die het mogelijk maken om SQLite2.x databases te benaderen. De eerste, de TSqlite class, is gedefinieerd in de SQLiteDataset unit. De tweede is gedefinieerd in de SQLiteds unit en is nieuwer en wordt bij de nieuwere fpc versie geïnstalleerd. De laatste heeft nog een paar voordelen boven de eerste versie, hij is sneller, maakt toevoegen, wijzigen en verwijderen mogelijk en kan deze updates automatisch door de database laten verwerken.
+
Er zijn twee TDataset afstammelingen die het mogelijk maken om SQLite2.x databases te benaderen. De eerste, de TSqlite class, is gedefinieerd in de SQLiteDataset unit. De tweede is gedefinieerd in de SQLiteds unit en is nieuwer en wordt bij de nieuwere fpc versie geïnstalleerd. De laatste heeft nog een paar voordelen boven de eerste versie, hij is sneller, maakt toevoegen, wijzigen en verwijderen mogelijk en kan deze updates automatisch door de database laten verwerken.
 
De aanwijzigingen die hier gegeven worden gaan uit van de TSqliteDataset uit de unit sqliteds.pas. Het is zelfs zo dat de "oude" sqlitedataset.pas file onder de nieuwere versie van fpc (1.9.8) niet meer gecompileerd kan worden.
 
De aanwijzigingen die hier gegeven worden gaan uit van de TSqliteDataset uit de unit sqliteds.pas. Het is zelfs zo dat de "oude" sqlitedataset.pas file onder de nieuwere versie van fpc (1.9.8) niet meer gecompileerd kan worden.
  
Line 408: Line 410:
  
 
Wie schrijft mij?
 
Wie schrijft mij?
 +
 +
== Lazarus and Interbase / Firebird ==
 +
 +
Zie [[Install Packages|Install Packages]]. Op deze pagina vind je een klein voorbeeld en bijbehorende uitleg over het verbinding met een IB of FB server.
  
 
== Lazarus en dBase ==
 
== Lazarus en dBase ==
Line 455: Line 461:
 
== Vertalingen van deze pagina ==
 
== Vertalingen van deze pagina ==
  
[[Lazarus_Database_Tutorial|Lazarus Database Tutorial]] Het origineel door Chris Kirkpatrick.<br>
+
[[Lazarus_Database_Tutorial|Lazarus Database Tutorial]] Het origineel.<br>
[[DbSpanishTutorial|Spaans]] door Eduardo Lopez (thanks! :)
+
[[Lazarus Database Tutorial/es|Spaans]] door Eduardo Lopez (thanks! :)
  
 
== Gerelateerde Links ==
 
== Gerelateerde Links ==
[[Databases|Creating Databases Applications with Lazarus using the DB-unit]]
+
[[Databases|Creating Databases Applications with Lazarus using the DB-unit]]<br>
 +
[[MySQLDatabases|Creating a database application using MySQL]]<br>
 +
[[Zeos_tutorial|Creating a database application using the Zeos components]]
 +
 
 +
[[Category:Databases/nl]]

Latest revision as of 11:17, 3 August 2011

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)

Overzicht

Deze paragraaf laat zien hoe je Lazarus kunt gebruiken met verschillende databases. Zoals je ziet zijn nog niet alle databases gedekt, dus... help mee om dit deel uit te breiden.

Lazarus en MySQL

MySQL werkend krijgen onder Linux of Windows

Volg de instructies van het MySQL User Manual. Zorg er voor dat de mysqld service draait en dat alle mogelijke gebruikers (waaronder root, mysql, jijzelf en eventueel andere gebruikers) net zoveel rechten hebben als nodig is, vanaf net zoveel computers (hosts) als nodig is (waaronder 'localhost', de naam van de computer waarop MySQL draait en eventueel andere computers in je netwerk.) Het mag duidelijk zijn dat het het beste is als alle gebruikers gebruik maken van een paswoord. Controleer de werking van de database server op basis van de voorbeelden die in de handleiding worden gegeven. Controleer ook of alle gebruikers de door hen benodigde toegang hebben.

MySQL werkend krijgen met FPC in een terminal

In de directory $(FreePascal_directory)/packages/base/mysql/ staat een voorbeeld programma. Deze directory bevat ook de units mysql.pp, mysql_com.pp and mysql_version.pp. Voordat je het test script uitvoert, moet je een database genaamd "testdb" aanmaken. Dit kun je doen door in te loggen met behulp van de mysql monitor (als root met alle rechten) en het volgende SQL statement uit te voeren.

CREATE DATABASE testdb;

zorg er dan voor dat alle gebruikers voldoende rechten hebben door commando's zoals het volgende:

GRANT ALL ON testdb TO johnny-user IDENTIFIED BY 'johnnyspassword'; 

uit te voeren. Er is een script genaamd mkdb, dat je nu moet uitvoeren:

sh ./mkdb

Waarschijnlijk mislukt dit omdat het systeem niet toestaat dat een anonieme gebruiker de database benadert. Wijzig het script nu zo dat de regel die de mysql client het script laat starten er zo uit ziet:

mysql -u root -p  ${1-testdb} << EOF >/dev/null

en probeer het script nogmaals uit te voeren, waarbij je het root paswoord invult op de prompt. Met een beetje geluk heb je nu de test database gemaakt. Controleer dit door het volgende mysql statement uit te voeren, vanuit je mysql monitor:

select * from FPdev;

Als het goed is zie je nu een tabel met de ID, username en email adressen van een paar van de FPC ontwikkelaars.

Probeer nu het testprogramma testdb.pp uit te voeren. (Waarschijnlijk moet dit eerst nog gecompileerd worden en zal het de eerste keer niet lukken om het succesvol uit te voeren!!)

Er kunnen een aantal redenen zijn waarom het programma geen verbinding kan maken met de mysql server:

  • Het systeem installeert een andere versie, bijv. mysql v4.0.15 en niet de versie 3 waarvoor het package is ontworpen.
  • Het programma heeft een geldige mysql gebruikersnaam en wachtwoord nodig om de database te benaderen.
  • De compiler moet weten waar het de mysql libraries kan vinden. (ALS JE DE MYSQL ONTWIKKEL LIBRARIES NOG NIET HEBT GEÏNSTALLEERD, DOE DAT DAN NU!)

Als je een copy maakt van testdb.pp, bijvoorbeeld trydb.pp, in plaats van het origineel aan te passen, zullen de bestanden bij volgende CVS updates ook weer up to date worden. Ook kun je de bestanden van de mysql/ver40/ subdirectory kopieren naar de mysql/ directory. Hernoem ze dan naar mysql_v4.pp, mysql_com_v4.pp and mysql_version_v4.pp, en zorg ervoor dat je de gebruikte units in iedere file ook aanpast. Dus: wijzig het uses statement in trydb.pp in

uses mysql_v4

en het statement in mysql_v4.pp in

uses mysql_com_v4

Waarschijnlijk moet er aan /etc/fpc.cfg een regel toegevoegd worden die wijst naar de libraries:

-Fl/lib;/usr/lib

en moet in de /usr/lib directory een link naar de mysqlclient library gemaakt worden. Bij het installeren van de ontwikkel libraries wordt deze link al aangemaakt. Mocht deze link er onverhoopt niet zijn dan kun je deze op de volgende manier aanmaken:

ln -s libmysqlclient.so.12.0.0 lmysqlclient

Controleer wel even de naam van jouw libraries. Voor de zekerheid kun je ook de volgende link aanmaken

ln -s libmysqlclient.so.12.0.0 mysqlclient

Sommigen moeten misschien de volgende link opnemen:

ln -s libmysqlclient.so.12.0.0 libmysqlclient.so

Wijzig dan trydb.pp zodanig dat het de gebruiker details kent, door de host, user en paswoord als constanten op te nemen:

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

Het kan zijn dat je geen verbinding kunt maken met behulp de mysql_connect() call, en je de mysql_real_connect() call moet gebruiken die meer parameters heeft. Om de zaak nog wat gecompliceerder te maken is het aantal parameters gewijzigd van versie 3 (daar waren het er 7) naar versie 4 (waar het er 8 zijn). Voordat je mysql_real_connect kunt aanroepen moet je waarschijnlijk mysql_init() aanroepen, die niet is opgenomen in de originele mysql.pp maar wel in mysql_v4.pp.

Dus de code om verbinding te maken met de database is:

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


OK, klaar om trydb.pp te compileren?

 fpc trydb

success! En voer het uit:

 ./trydb

YES! Je hebt een lijst van FPC ontwikkelaars!

Een paar mogelijke verbeteringen: Je kunt de invoer van de gebruiker gegevens en de SQL commando's interactief maken. Hiervoor worden variabelen gebruikt in plaats van constanten. Er kunnen SQL commando's ingevoerd worden totdat het commando 'quit' wordt ingevoerd. Zie de volledige listing. In deze versie worden de gebruikers gegevens in de console ingevoerd, waarna het programma in een loop komt waarbij SQL commando's kunnen worden ingevoerd en de resultaten worden getoond. Het programma eindigt als 'quit' wordt ingevoerd.

Zie ook Sample Console Listing.

Verbinding met MySQL vanuit een Lazarus Programma

Deze paragraaf toont hoe je Lazarus kunt verbinden met een MySQL database, en hoe je eenvoudige queries kunt laten uitvoeren met gebruik van de basic Lazarus componenten. Er worden geen data-aware componenten gebruikt, maar het laat de principes zien van het verbinden met de database.

Maak een nieuw project in Lazarus:

Project -> New Project -> Application

Kies voor Application en klik op Create. Er zal een nieuw automatisch gegenereerd Form worden getoond.

Vergroot het form zodat het ongeveer 600 bij 800 is. Geef het form een nieuwe naam en wijzig de caption in 'TryMySQL'.

Van de Standard Componenten tab plaats je drie Editboxes in de linker bovenhoek van het Form, en plaats direct boven elke editbox labels. Wijzig de captions en namen in 'Host' (en HostLabel,HostEdit), 'UserName' (en UserLabel, UserEdit) en 'Password' (met PasswdLabel en PasswdEdit). Je kunt natuurlijk ook gebruik maken van de LabelledEdit componenten van de Additional tab.

Selecteer de Passwd Editbox en zoek de PasswordChar property: wijzig dit in * , zodat wanneer je hier een paswoord intypt de letters niet getoond worden maar een serie van *-en. Zorg er voor dat de Text properties van alle editbox-en leeg zijn.

Onder deze editbox plaatsen we een button. Zet de Caption hiervan op 'Connect to server' en geef het de naam 'ConnectButton'.

Daarna zetten we een tweetal Comboboxen op het form met daarboven een Label. Deze noemen we DatabaseComboBox (en DatabaseLabel) en TableComboBox (en TableLabel). Tussen beide comboboxen plaatsen we nog een button, Caption = Select Database, Name = SelectDBButton.

Dan nog een Label, een Listbox (FieldLabel en FieldListbox) en een Button (Caption = Exit, Name = ExitButton)

Plaats nu nog een Editbox en label aan de rechter bovenkant van je form. Wijzig het label in 'Enter SQL Command' en noem de Editbox CommandEdit. Daaronder plaats je een button, 'Send Query' (QueryButton).

Plaats een grote Memo op het form genaamd 'Results' (ResultMemo) op de rechter onderkant, zodanig dat het het grootste deel van het form vult. Zet het ScrollBars property op ssAutoBoth zodat de scroll bars automatisch veschijnen als het memo wordt gevuld. Zet het WordWrap property op True.

Plaats een Status Bar (van de Common Controls tab) aan de onderkant van het Form, en zet de SimpleText property op 'TryMySQL'.

Een screenshot van het formulier kun je hier zien: Mysql Example Screenshot

Nu moeten we nog de code (een aantal event handlers) schrijven.

De drie Editboxen aan de linker bovenkant worden gebruikt om de hostnaam, gebruikersnaam en het wachtwoord in te voeren. Wanneer deze zijn ingevuld kan er op de "Connect" button geklikt worden. De OnClick-event van deze button is gebaseerd op een deel van het FPC programma hierboven.

Omdat we nu de antwoorden van de database server niet met Write of WriteLn kunnen tonen, zullen we deze in het Memo laten zien. Hiervoor is het wel noodzakelijk dat we deze resultaten omzetten naar strings. We maken hiervoor een methode van ons form die de strings in het memo plaatst.

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

Het OnClick-event van de ConnectButton wordt dan:

procedure TFormTryMySQL.ConnectButtonClick(Sender: TObject);
var
  databasenamesBuffer: PMYSQL_RES;
  aDatabase: TMYSQL_ROW;
begin
  // Connect to server.
  // Clear a previous connection.
  if mySQLSock <> nil then begin
    mysql_close(mySQLSock);
    DatabaseComboBox.Clear;
    DatabaseComboBoxChange(DatabaseComboBox);
  end;
  mySQLSock := mysql_connect(@mySQLq, PChar(HostEdit.Text),
                             PChar(UserEdit.Text), PChar(PasswdEdit.Text));
  if mySQLSock = nil then begin
    ShowString('Connection to server failed.');
    ShowString('Error was: '+ StrPas(mysql_error(@mySQLq)));
  end else begin
    StatusBar1.SimpleText := 'Connected to database server.';
    ShowString('Host info       : ' + StrPas(mysql_get_host_info(mySQLSock)));
    ShowString('Server info     : ' + StrPas(mysql_stat(mySQLSock)));
    ShowString('Client info     : ' + Strpas(mysql_get_client_info));
  {$ifdef Unix}
    ShowString('Mysql_port      : '+ IntToStr(mysql_port));
    ShowString('Mysql_unix_port : ' + StrPas(mysql_unix_port));
  {$endif}
    databasenamesBuffer := mysql_list_dbs(mySQLSock, nil);
    try
      // Add each database as a item to our DatabaseComboBox.
      aDatabase := mysql_fetch_row(databasenamesBuffer);
      while (aDatabase <> nil) do begin
        DatabaseComboBox.Items.Add(aDatabase[0]);
        adatabase := mysql_fetch_row(databasenamesBuffer);
      end;
    finally
      // finally free the result.
      mysql_free_result(databasenamesBuffer);
    end;
  end;
end;

Als dit succesvol is geweest, zal de DatabaseComboBox gevuld zijn met de op de server bekende databases. De SelectDBButton wordt dan geactiveerd zodra er een database is geselecteerd in de ComboBox. Een druk op de SelectDBButton zal de TableComboBox vullen met de in de database aanwezige tabellen. Bovendien zal dan ook de OpenQueryButton 'enabled' worden. Een en ander gebeurt in de volgende code:

procedure TFormTryMySQL.SelectDBButtonClick(Sender: TObject);
var
  tablenamesBuffer: PMYSQL_RES;
  aTable: TMYSQL_ROW;
begin
  // Connect to the selected database
  if DatabaseComboBox.ItemIndex <> -1 then begin // not really necessary but ...
    ShowString('Now selecting database : ' + DatabaseComboBox.Text);
    if mysql_select_db(mySQLSock, PChar(DatabaseComboBox.Text)) < 0 then begin
      // if we failed, the QueryButton must not be enabled. :)
      OpenQueryButton.Enabled := False;
      // Show what went wrong.
      ShowString('Couldnt select database '+ DatabaseComboBox.Text);
      ShowString(mysql_error(mySQLSock));
    end else begin
      // We got connected to the database, so lets get a list of tables.
      TableComboBox.Clear;
      tablenamesBuffer := mysql_list_tables(mySQLSock, nil);
      aTable := mysql_fetch_row(tablenamesBuffer);
      // Off course "SHOW TABLES" could work as well.
      while (aTable <> nil) do begin
        TableComboBox.Items.Add(aTable[0]);
        aTable := mysql_fetch_row(tablenamesBuffer);
      end;
      mysql_free_result(tablenamesBuffer);
      OpenQueryButton.Enabled := True;
    end;
  end else begin
    ShowMessage('Please select a database in the databasecombobox.');
  end;
end;

In de EditBox rechts bovenin het form kan dan een SQL commando worden ingevoerd (zonder afsluitende punt-komma). Als er op de OpenQuery button geklikt wordt, wordt het commando naar de server gestuurd en als er data te tonen is, zal dat in een tweede form getoond worden.

Ook het OnClick-event van de OpenQuery-button is gebaseerd op de code van de FPC versie hierboven.

Het OnClick-event voor de OpenQuery-button is als volgt:

procedure TFormTryMySQL.OpenQueryButtonClick(Sender: TObject);
var
  I: Integer;
  tableBuffer: PMYSQL_RES;
  recordBuffer: TMYSQL_ROW;
  aColumn: TListColumn;
begin
// An example of how to work with the returned data.
  StatusBar1.SimpleText := 'Executing query: ' + CommandEdit.Text;
  ShowString('Executing query: ' + CommandEdit.Text);
  ShowQueryForm := TShowQueryForm.Create(nil);
  try
    Screen.Cursor := crHourGlass;
    try
      if (mysql_query(mySQLSock, pChar(CommandEdit.Text)) < 0) then begin
        ShowString('Query failed '+ StrPas(mysql_error(mySQLSock)));
        Raise(Exception.Create('Query failed.'));
      end else begin
        tableBuffer := mysql_store_result(mySQLSock);
        // mysql_store_result will return nil if there was nothing to store.
        if tableBuffer <> nil then begin
          ShowString('Number of records returned  : ' +
                                        IntToStr(mysql_num_rows(tableBuffer)));
          ShowString('Number of fields per record : ' +
                                      IntToStr(mysql_num_fields(tableBuffer)));
          try
            ShowQueryForm.ListView1.Columns.Clear;
            // Now we are going to add a column for each field in the return set
            // The caption of the columns we name after the fieldnames.
            for I := 0 to pred(mysql_num_fields(tableBuffer)) do begin
              aColumn := ShowQueryForm.ListView1.Columns.Add;
              aColumn.Caption := mysql_fetch_field_direct(tableBuffer, I).name;
            end;
            // Let us see if the table contained data an ask for the first record
            recordBuffer := mysql_fetch_row(tableBuffer);
            while (recordBuffer <> nil) do begin
              // We got some data lets add them to our view.
              with ShowQueryForm.ListView1.Items.Add do begin
                Caption := recordBuffer[0]; // This fills the first column
                for I := 1 to pred(mysql_num_fields(tableBuffer)) do
                  // Then we will add the other fields.
                  SubItems.Add(recordBuffer[I]);
              end;
              recordBuffer := mysql_fetch_row(tableBuffer);
            end; //while
          finally
            mysql_free_result(tableBuffer);
          end;
        end else begin
          ShowString('Query didnot return any results.');
        end;
      end;
    finally
      Screen.Cursor := crDefault;
    end;
    ShowQueryForm.ShowModal;
  finally
    ShowQueryForm.Free;
  end;
end;

Er zijn nog een drietal andere event-handlers geschreven. Eén voor het OnClose-event van het form en voor de OnChange-events van beide ComboBoxen.

In afwijking van het FPC programma, wordt het Lazarus programma niet afgebroken als er een fout optreedt. In plaats daarvan komt de controle weer terug bij het hoofd form (main form) en wordt de gelegenheid gegeven om het commando te verbeteren voordat het opnieuw wordt verstuurd naar de server. Het programma wordt afgesloten als op de Exit button wordt geklikt, hierbij wordt ook de verbinding met de MySQL server gesloten.

OK! Sla je project op en klik op Run -> Run

Download MySQL Source Code

Een volledige listing van het programma is hier te downloaden Sample Source Code Er staat meer commentaar in de sources, dat de verschillende onderdelen toelicht.

Lazarus en Postgresql

Wie schrijft mij?

Lazarus en SQLite

door Luiz Américo

Introductie

Er zijn twee TDataset afstammelingen die het mogelijk maken om SQLite2.x databases te benaderen. De eerste, de TSqlite class, is gedefinieerd in de SQLiteDataset unit. De tweede is gedefinieerd in de SQLiteds unit en is nieuwer en wordt bij de nieuwere fpc versie geïnstalleerd. De laatste heeft nog een paar voordelen boven de eerste versie, hij is sneller, maakt toevoegen, wijzigen en verwijderen mogelijk en kan deze updates automatisch door de database laten verwerken. De aanwijzigingen die hier gegeven worden gaan uit van de TSqliteDataset uit de unit sqliteds.pas. Het is zelfs zo dat de "oude" sqlitedataset.pas file onder de nieuwere versie van fpc (1.9.8) niet meer gecompileerd kan worden.

Benodigdheden

  • fpc 1.9.8
  • sqliteds.pas (Haal deze eventueel van fpc/fcl/db/sqlite op de CVS-server)
  • sqlite runtime library 2.8.15 of hoger (Haal deze van www.sqlite.org)

Voordat je een Lazarus project begint, controleer dan dat:

  • de sqlite library te vinden is in het system PATH
  • onder linux moet cmem als de eerste unit in de uses clause van het Main form vermeld worden

De grondbeginselen

De sqlite package die bij de standaard lazarus installatie zie is gebaseerd op de oude sqlitedataset unit. Je kunt een package die gebruik maakt van de nieuwe unit hierdownloaden.

Tijdens het ontwerp moet je de volgende properties zetten:

  • FileName: pad naar de sqlite file [verplicht]
  • TableName: de naam van de tabel die gebruikt wordt in het sql statement [verplicht]
  • Sql: een SQL select statement [optioneel]

Een Table (Dataset) maken

Op dit moment is het niet mogelijk een tabel gedurende het programma ontwerp te maken dus is het noodzakelijk de tabel tijdens de uitvoering van het programma te maken als deze tenminste nog niet bestaat. Het beste moment hiervoor is in het OnCreate event van het "main" form.

Het voorbeeld hieronder laat zien hoe je dit kunt doen. (dsTest is een instantie van TSqliteDataSet):

 // Maake een tabel met alle door de TSqliteDataset ondersteunde veld typen
 with dsTest do
 begin
   if not TableExists then begin
     with FieldDefs do begin
       Clear;
       Add('Integer',ftInteger);
       Add('AutoInc',ftAutoInc);
       Add('String',ftString);
       Add('Memo',ftMemo);
       Add('Bool',ftBoolean); 
       Add('Float',ftFloat);
       Add('Word',ftWord);
       Add('DateTime',ftDateTime);
       Add('Date',ftDate);
       Add('Time',ftTime);
     end;
     CreateTable; 
   end;
 end;

Gegevens opvragen

Nadat de tabel is gemaakt, kun je deze benaderen met de Open method. Als het SQL property geen waarde heeft worden alle velden van alle records uit de tabel opgehaald, dus alsof

 SQL:='Select * from TABLENAME'; 

Maar het is natuurlijk ook mogelijk om een combinatie van velden op te vragen door het SQL property te zetten zoals:

 SQL:='Select Float from TABLENAME';
 SQL:='Select String,Date,Word from TABLENAME';

Onthoud dat de beschikbare velden en de volgorde van deze velden na het openen van de dataset bepaald worden door het opgegeven select statement. In boven genoemde voorbeelden zijn er dus respectievelijk 10, 1 en 3 velden beschikbaar.

Wijzigingen doorvoeren op de onderliggende database

Voor het opslaan van de wijzigingen in de onderliggende database is het noodzakelijk dat de tabel een Primary key heeft. Bijvoorbeeld een AutoInc veld.

Als bijvoorbeeld het veld 'Integer' waarden bevat die altijd aanwezig en uniek zijn, dan kunnen na

 FieldIndexName:='Integer';

gegevens in de database file worden opgeslagen.

Hiervoor kun je de ApplyUpdates method gebruiken.

Opmerkingen

  • Hoewel dit tijdens een test met 10000 records goed werkte, moet je er wel rekening mee houden dat de TSqliteDataset alle gegevens in het geheugen houdt. Dus haal alleen de noodzakelijke gegevens op.
  • Een database file kan meerdere tabellen bevatten.
  • Het is mogelijke meerdere datasets (met verschillende velden) te maken die dezelfde database tabel benaderen.
  • Het is mogelijk om de data te filteren met behulp van een WHERE statement. Het sluiten en het weer openen vban een dataset (of het aanroepen van de RefetchData method) is ook mogelijk.
  • Je kunt ook complexe SQL statements gebruiken waarin aliases en joins worden gebruikt. Het is in dit geval echter niet mogelijk om gegevens te wijzigen, ApplyUpdates werkt dus niet. Als je echter toch complexe queries wilt gebruiken en gegevens wilt kunnen wijzigen, dan mag je mij een mailtje sturen en ik zal je een paar hints geven over hoe je dat kunt doen.
  • Als je gebruik maakt van een bestand die niet is aangemaakt met behulp van een TSqliteDataset zijn er een paar beperkingen. Niet alle velden worden dan juist gedetecteerd. De niet herkende veldtype worden als een string behandeld.

Een algemeen voorbeeld kan gevonden worden in de fpc/fcl/sqlite CVS directory.

Luiz Américo pascalive(at)bol(dot)com(dot)br

Lazarus en MSSQL

Wie schrijft mij?

Lazarus and Interbase / Firebird

Zie Install Packages. Op deze pagina vind je een klein voorbeeld en bijbehorende uitleg over het verbinding met een IB of FB server.

Lazarus en dBase

Tony Maro

Kijk ook eens naar de aanzet voor een TDbf Tutorial page

FPC bevat een simpel database component die qua functionaliteit is te vergelijken met het TTable component van Delphi. Dit component ("TDbf", (TDbf Website)) ondersteund een aantal basis handelingen met dBase files. Omdat het niet standaard wordt geïnstallleerd, zul je dit component dus zelf moeten doen. Je kunt het package vinden in de "lazarus/components/tdbf" directory. Na installatie van het package en een "rebuild" van je Lazarus IDE, vind je het component naast het TDatasource component in je componenten palette.

Het voordeel van het TDbf component is dat er geen extra libraries nodig zijn, maar het is niet de beste keuze voor een grote database applicatie.

Het gebruik van een TDbf component is erg eenvoudig. Plaats eenTDbf component op je form, vul het FilePathFull property met het pad naar de directory waar de bestanden staan, vul het TableName property met de naam van de tabel en verbind het met een TDatasource.

Voor het echte werk zul je echter nog wel iets meer moeten doen. Als een tabel nog niet bestaat, zul je hem met behulp van je programma moeten aanmaken. Of er moet een compatibele tabellen maker zijn die ik niet ken.

Als je een niet bestaande tabel probeert te openen zal er een error gegenereert worden. Je kunt tijdens runtime een tabel aanmaken als het pad (FilePathFull) en de naam (TableName) een waarde hebben.

De volgende code maakt een tabel genaamd "dvds" om he dvd verzameling in te registreren. Dus plaats een TDbf component op je form in in het OnCreate event van je form plaats je de volgende code:

   Dbf1.FilePathFull = '/pad/naar/mijn/database';
   Dbf1.TableName = 'dvds';
   With Dbf1.FieldDefs do begin
       Add('Name', ftString, 80, True);
       Add('Description', ftMemo, 0, False);
       Add('Rating', ftString, 5, False);
   end;
   Dbf1.CreateTable;

Nadat deze code is uitgevoerd is er een bestand "dvds.dbf" aangemaakt. Hierna kun je met behulp van alle data aware componenten, die via een DataSource aan het TDbf component zijn verbonden, de gegevens in de tabel eenvoudig benaderen en wijzigen.

Het maken van een index

Het toevoegen van een index wijkt een beetje of van de typische TTable. Het moet namelijk gedaan worden, nadat de tabel is geopend. Op deze wijze moeten ook de index opnieuw opgebouwd worden. Bijvoorbeeld:

   Dbf1.Exclusive := True;
   Dbf1.Open;
   Dbf1.AddIndex('dvdsname','Name',[ixPrimary, ixUnique, ixCaseInsensitive]);
   Dbf1.AddIndex('rating.ndx', 'Rating', [ixCaseInsensitive]);
   Dbf1.Close;

De eerste (primaire) index wordt opgeslagen in een bestand "dvdsname.mdx" en de tweede index wordt opgeslagen in een bestand genaamd "rating.ndx". Omdat index opgeslagen worden in aparte bestanden moet je er dus voor zorgen dat je niet twee maal dezelfde naam gebruikt.

Ik zal proberen om op een later moment een meer gedetaileerd voorbeeld toe te voegen, maar ik hoop dat dit de delphi programmeurs snel op weg helpt bij het gebruik van databases in Lazarus!

Vertalingen van deze pagina

Lazarus Database Tutorial Het origineel.
Spaans door Eduardo Lopez (thanks! :)

Gerelateerde Links

Creating Databases Applications with Lazarus using the DB-unit
Creating a database application using MySQL
Creating a database application using the Zeos components