Sign in Join
Wiki copytemporary

Lazarus Database Tutorial/nl: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11## Overzicht
22
33Deze 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.
44
55## Lazarus en MySQL
66
77### MySQL werkend krijgen onder Linux of Windows
88
99Volg 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.
1010
1111### MySQL werkend krijgen met FPC in een terminal
1212
1313In 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.
1414
1515`CREATE DATABASE testdb;`
1616
1717zorg er dan voor dat alle gebruikers voldoende rechten hebben door commando's zoals het volgende:
1818
1919`GRANT ALL ON testdb TO johnny-user IDENTIFIED BY 'johnnyspassword'; `
2020
2121uit te voeren. Er is een script genaamd mkdb, dat je nu moet uitvoeren:
2222
2323`sh ./mkdb`
2424
2525Waarschijnlijk 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:
2626
2727`mysql -u root -p  ${1-testdb} << EOF >/dev/null`
2828
2929en 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:
3030
3131`select * from FPdev;`
3232
3333Als het goed is zie je nu een tabel met de ID, username en email adressen van een paar van de FPC ontwikkelaars.
3434
3535Probeer 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!!)
3636
3737Er kunnen een aantal redenen zijn waarom het programma geen verbinding kan maken met de mysql server:
3838
3939- Het systeem installeert een andere versie, bijv. mysql v4.0.15 en niet de versie 3 waarvoor het package is ontworpen.
4040
4141- Het programma heeft een geldige mysql gebruikersnaam en wachtwoord nodig om de database te benaderen.
4242
4343- 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!)
4444
4545Als 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
4646
4747`uses mysql_v4`
4848
4949en het statement in mysql_v4.pp in
5050
5151`uses mysql_com_v4`
5252
5353Waarschijnlijk moet er aan /etc/fpc.cfg een regel toegevoegd worden die wijst naar de libraries:
5454
5555`-Fl/lib;/usr/lib`
5656
5757en 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:
5858
5959`ln -s libmysqlclient.so.12.0.0 lmysqlclient`
6060
6161Controleer wel even de naam van jouw libraries. Voor de zekerheid kun je ook de volgende link aanmaken
6262
6363`ln -s libmysqlclient.so.12.0.0 mysqlclient`
6464
6565Sommigen moeten misschien de volgende link opnemen:
6666
6767`ln -s libmysqlclient.so.12.0.0 libmysqlclient.so`
6868
6969Wijzig dan trydb.pp zodanig dat het de gebruiker details kent, door de host, user en paswoord als constanten op te nemen:
7070
7171`const`\
7272`  host : Pchar= 'localhost';`\
7373`  user : Pchar= 'myusername';`\
7474`  passwd: Pchar = 'mypassword';`
7575
7676Het 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.
7777
7878Dus de code om verbinding te maken met de database is:
7979
8080`{ a few extra variables}`\
8181`var`\
8282`  alloc : PMYSQL;`\
8383` `\
8484`{main program fragment}`\
8585` `\
8686`begin`\
8787` if paramcount=1 then`\
8888`   begin`\
8989`   Dummy:=Paramstr(1)+#0;`\
9090`   DataBase:=@Dummy[1];`\
9191`   end;`\
9292` `\
9393`Writeln ('Allocating Space...');`\
9494` alloc := mysql_init(PMYSQL(@qmysql));`\
9595` Write ('Connecting to MySQL...');`\
9696` sock :=  mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);`\
9797` if sock=Nil then`\
9898`   begin`\
9999`   Writeln (stderr,'Couldn''t connect to MySQL.');`\
100100`   Writeln (stderr, 'Error was: ', mysql_error(@qmysql));`\
101101`   halt(1);`\
102102`   end;`\
103103` Writeln ('Done.');`\
104104` Writeln ('Connection data:');`\
105105`{$ifdef Unix}`\
106106` writeln ('Mysql_port      : ',mysql_port);`\
107107` writeln ('Mysql_unix_port : ',mysql_unix_port);`\
108108`{$endif}`\
109109` writeln ('Host info       : ',mysql_get_host_info(sock));`\
110110` writeln ('Server info     : ',mysql_stat(sock));`\
111111` writeln ('Client info     : ',mysql_get_client_info);`\
112112` `\
113113` Writeln ('Selecting Database ',DataBase,'...');`\
114114` if mysql_select_db(sock,DataBase) < 0 then`\
115115`   begin`\
116116`   Writeln (stderr,'Couldn''t select database ',Database);`\
117117`   Writeln (stderr,mysql_error(sock));`\
118118`   halt (1);`\
119119`   end;`\
120120`{... as original contents of testdb.pp}`
121121
122122OK, klaar om trydb.pp te compileren?
123123
124124` fpc trydb`
125125
126126success! En voer het uit:
127127
128128` ./trydb`
129129
130130YES! Je hebt een lijst van FPC ontwikkelaars!
131131
132132Een 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.
133133
134134Zie ook [[Lazarus Database Tutorial/SampleListing|Sample Console Listing]].
135135
136136### Verbinding met MySQL vanuit een Lazarus Programma
137137
138138Deze 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.
139139
140140Maak een nieuw project in Lazarus:
141141
142142`Project -> New Project -> Application`
143143
144144Kies voor Application en klik op Create. Er zal een nieuw automatisch gegenereerd Form worden getoond.
145145
146146Vergroot het form zodat het ongeveer 600 bij 800 is. Geef het form een nieuwe naam en wijzig de caption in 'TryMySQL'.
147147
148148Van 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.
149149
150150Selecteer 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.
151151
152152Onder deze editbox plaatsen we een button. Zet de Caption hiervan op 'Connect to server' en geef het de naam 'ConnectButton'.
153153
154154Daarna 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.
155155
156156Dan nog een Label, een Listbox (FieldLabel en FieldListbox) en een Button (Caption = Exit, Name = ExitButton)
157157
158158Plaats 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).
159159
160160Plaats 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.
161161
162162Plaats een Status Bar (van de Common Controls tab) aan de onderkant van het Form, en zet de SimpleText property op 'TryMySQL'.
163163
164164Een screenshot van het formulier kun je hier zien: [Mysql Example Screenshot](http://lazarus-ccr.sourceforge.net/kb/index.php/Image:Trymysql.png)
165165
166166Nu moeten we nog de code (een aantal event handlers) schrijven.
167167
168168De 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.
169169
170170Omdat 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.
171171
172172`procedure TtrymysqlForm1.ShowString (S : string);`\
173173`(* display a string in a Memo box *)`\
174174`begin`\
175175`  ResultsMemo.Lines.Add (S)`\
176176`end;`
177177
178178Het OnClick-event van de ConnectButton wordt dan:
179179
180180`procedure TFormTryMySQL.ConnectButtonClick(Sender: TObject);`\
181181`var`\
182182`  databasenamesBuffer: PMYSQL_RES;`\
183183`  aDatabase: TMYSQL_ROW;`\
184184`begin`\
185185`  // Connect to server.`\
186186`  // Clear a previous connection.`\
187187`  if mySQLSock <> nil then begin`\
188188`    mysql_close(mySQLSock);`\
189189`    DatabaseComboBox.Clear;`\
190190`    DatabaseComboBoxChange(DatabaseComboBox);`\
191191`  end;`\
192192`  mySQLSock := mysql_connect(@mySQLq, PChar(HostEdit.Text),`\
193193`                             PChar(UserEdit.Text), PChar(PasswdEdit.Text));`\
194194`  if mySQLSock = nil then begin`\
195195`    ShowString('Connection to server failed.');`\
196196`    ShowString('Error was: '+ StrPas(mysql_error(@mySQLq)));`\
197197`  end else begin`\
198198`    StatusBar1.SimpleText := 'Connected to database server.';`\
199199`    ShowString('Host info       : ' + StrPas(mysql_get_host_info(mySQLSock)));`\
200200`    ShowString('Server info     : ' + StrPas(mysql_stat(mySQLSock)));`\
201201`    ShowString('Client info     : ' + Strpas(mysql_get_client_info));`\
202202`  {$ifdef Unix}`\
203203`    ShowString('Mysql_port      : '+ IntToStr(mysql_port));`\
204204`    ShowString('Mysql_unix_port : ' + StrPas(mysql_unix_port));`\
205205`  {$endif}`\
206206`    databasenamesBuffer := mysql_list_dbs(mySQLSock, nil);`\
207207`    try`\
208208`      // Add each database as a item to our DatabaseComboBox.`\
209209`      aDatabase := mysql_fetch_row(databasenamesBuffer);`\
210210`      while (aDatabase <> nil) do begin`\
211211`        DatabaseComboBox.Items.Add(aDatabase[0]);`\
212212`        adatabase := mysql_fetch_row(databasenamesBuffer);`\
213213`      end;`\
214214`    finally`\
215215`      // finally free the result.`\
216216`      mysql_free_result(databasenamesBuffer);`\
217217`    end;`\
218218`  end;`\
219219`end;`
220220
221221Als 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:
222222
223223`procedure TFormTryMySQL.SelectDBButtonClick(Sender: TObject);`\
224224`var`\
225225`  tablenamesBuffer: PMYSQL_RES;`\
226226`  aTable: TMYSQL_ROW;`\
227227`begin`\
228228`  // Connect to the selected database`\
229229`  if DatabaseComboBox.ItemIndex <> -1 then begin // not really necessary but ...`\
230230`    ShowString('Now selecting database : ' + DatabaseComboBox.Text);`\
231231`    if mysql_select_db(mySQLSock, PChar(DatabaseComboBox.Text)) < 0 then begin`\
232232`      // if we failed, the QueryButton must not be enabled. :)`\
233233`      OpenQueryButton.Enabled := False;`\
234234`      // Show what went wrong.`\
235235`      ShowString('Couldn''t select database '+ DatabaseComboBox.Text);`\
236236`      ShowString(mysql_error(mySQLSock));`\
237237`    end else begin`\
238238`      // We got connected to the database, so lets get a list of tables.`\
239239`      TableComboBox.Clear;`\
240240`      tablenamesBuffer := mysql_list_tables(mySQLSock, nil);`\
241241`      aTable := mysql_fetch_row(tablenamesBuffer);`\
242242`      // Off course "SHOW TABLES" could work as well.`\
243243`      while (aTable <> nil) do begin`\
244244`        TableComboBox.Items.Add(aTable[0]);`\
245245`        aTable := mysql_fetch_row(tablenamesBuffer);`\
246246`      end;`\
247247`      mysql_free_result(tablenamesBuffer);`\
248248`      OpenQueryButton.Enabled := True;`\
249249`    end;`\
250250`  end else begin`\
251251`    ShowMessage('Please select a database in the `*`database`*`combobox.');`\
252252`  end;`\
253253`end;`
254254
255255In 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.
256256
257257Ook het OnClick-event van de OpenQuery-button is gebaseerd op de code van de FPC versie hierboven.
258258
259259Het OnClick-event voor de OpenQuery-button is als volgt:
260260
261261`procedure TFormTryMySQL.OpenQueryButtonClick(Sender: TObject);`\
262262`var`\
263263`  I: Integer;`\
264264`  tableBuffer: PMYSQL_RES;`\
265265`  recordBuffer: TMYSQL_ROW;`\
266266`  aColumn: TListColumn;`\
267267`begin`\
268268`// An example of how to work with the returned data.`\
269269`  StatusBar1.SimpleText := 'Executing query: ' + CommandEdit.Text;`\
270270`  ShowString('Executing query: ' + CommandEdit.Text);`\
271271`  ShowQueryForm := TShowQueryForm.Create(nil);`\
272272`  try`\
273273`    Screen.Cursor := crHourGlass;`\
274274`    try`\
275275`      if (mysql_query(mySQLSock, pChar(CommandEdit.Text)) < 0) then begin`\
276276`        ShowString('Query failed '+ StrPas(mysql_error(mySQLSock)));`\
277277`        Raise(Exception.Create('Query failed.'));`\
278278`      end else begin`\
279279`        tableBuffer := mysql_store_result(mySQLSock);`\
280280`        // mysql_store_result will return nil if there was nothing to store.`\
281281`        if tableBuffer <> nil then begin`\
282282`          ShowString('Number of records returned  : ' +`\
283283`                                        IntToStr(mysql_num_rows(tableBuffer)));`\
284284`          ShowString('Number of fields per record : ' +`\
285285`                                      IntToStr(mysql_num_fields(tableBuffer)));`\
286286`          try`\
287287`            ShowQueryForm.ListView1.Columns.Clear;`\
288288`            // Now we are going to add a column for each field in the return set`\
289289`            // The caption of the columns we name after the fieldnames.`\
290290`            for I := 0 to pred(mysql_num_fields(tableBuffer)) do begin`\
291291`              aColumn := ShowQueryForm.ListView1.Columns.Add;`\
292292`              aColumn.Caption := mysql_fetch_field_direct(tableBuffer, I).name;`\
293293`            end;`\
294294`            // Let us see if the table contained data an ask for the first record`\
295295`            recordBuffer := mysql_fetch_row(tableBuffer);`\
296296`            while (recordBuffer <> nil) do begin`\
297297`              // We got some data lets add them to our view.`\
298298`              with ShowQueryForm.ListView1.Items.Add do begin`\
299299`                Caption := recordBuffer[0]; // This fills the first column`\
300300`                for I := 1 to pred(mysql_num_fields(tableBuffer)) do`\
301301`                  // Then we will add the other fields.`\
302302`                  SubItems.Add(recordBuffer[I]);`\
303303`              end;`\
304304`              recordBuffer := mysql_fetch_row(tableBuffer);`\
305305`            end; //while`\
306306`          finally`\
307307`            mysql_free_result(tableBuffer);`\
308308`          end;`\
309309`        end else begin`\
310310`          ShowString('Query didnot return any results.');`\
311311`        end;`\
312312`      end;`\
313313`    finally`\
314314`      Screen.Cursor := crDefault;`\
315315`    end;`\
316316`    ShowQueryForm.ShowModal;`\
317317`  finally`\
318318`    ShowQueryForm.Free;`\
319319`  end;`\
320320`end;`
321321
322322Er 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.
323323
324324In 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.
325325
326326OK! Sla je project op en klik op Run -\> Run
327327
328328#### Download MySQL Source Code
329329
330330Een volledige listing van het programma is hier te downloaden [Sample Source Code](http://prdownloads.sourceforge.net/lazarus-ccr/trymysql20050404.tar.gz?download) Er staat meer commentaar in de sources, dat de verschillende onderdelen toelicht.
331331
332332## Lazarus en Postgresql
333333
334334Wie schrijft mij?
335335
336336## Lazarus en SQLite
337337
338338door Luiz Américo
339339
340340### Introductie
341341
342342Er 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.
343343
344344### Benodigdheden
345345
346346- fpc 1.9.8
347347- sqliteds.pas (Haal deze eventueel van fpc/fcl/db/sqlite op de CVS-server)
348348- sqlite runtime library 2.8.15 of hoger (Haal deze van www.sqlite.org)
349349
350350**Voordat je een Lazarus project begint, controleer dan dat:**
351351
352352- de sqlite library te vinden is in het system PATH
353353- onder linux moet cmem als de eerste unit in de uses clause van het Main form vermeld worden
354354
355355### De grondbeginselen
356356
357357De 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 [hier](http://www.geocities.com/camara_luiz/sqliteds.zip)downloaden.
358358
359359Tijdens het ontwerp moet je de volgende properties zetten:
360360
361361- FileName: pad naar de sqlite file \[verplicht\]
362362- TableName: de naam van de tabel die gebruikt wordt in het sql statement \[verplicht\]
363363- Sql: een SQL select statement \[optioneel\]
364364
365365**Een Table (Dataset) maken**
366366
367367Op 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.
368368
369-Het voorbeeld hieronder laat zien hoe je dit kunt doen. (dsTest is een instantie van TSqliteDataSet): <code>
369+Het voorbeeld hieronder laat zien hoe je dit kunt doen. (dsTest is een instantie van TSqliteDataSet):
370370
371371` // Maake een tabel met alle door de TSqliteDataset ondersteunde veld typen`\
372372` with dsTest do`\
373373` begin`\
374374`   if not TableExists then begin`\
375375`     with FieldDefs do begin`\
376376`       Clear;`\
377377`       Add('Integer',ftInteger);`\
378378`       Add('AutoInc',ftAutoInc);`\
379379`       Add('String',ftString);`\
380380`       Add('Memo',ftMemo);`\
381381`       Add('Bool',ftBoolean); `\
382382`       Add('Float',ftFloat);`\
383383`       Add('Word',ftWord);`\
384384`       Add('DateTime',ftDateTime);`\
385385`       Add('Date',ftDate);`\
386386`       Add('Time',ftTime);`\
387387`     end;`\
388388`     CreateTable; `\
389389`   end;`\
390390` end;`
391391
392-</code>
393-
394392**Gegevens opvragen**
395393
396-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 <code>
394+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
397395
398396` SQL:='Select * from TABLENAME'; `
399397
400-</code> Maar het is natuurlijk ook mogelijk om een combinatie van velden op te vragen door het SQL property te zetten zoals: <code>
398+Maar het is natuurlijk ook mogelijk om een combinatie van velden op te vragen door het SQL property te zetten zoals:
401399
402400` SQL:='Select Float from TABLENAME';`\
403401` SQL:='Select String,Date,Word from TABLENAME';`
404402
405-</code> 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.
403+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.
406404
407405**Wijzigingen doorvoeren op de onderliggende database**
408406
409407Voor het opslaan van de wijzigingen in de onderliggende database is het noodzakelijk dat de tabel een Primary key heeft. Bijvoorbeeld een AutoInc veld.
410408
411-Als bijvoorbeeld het veld 'Integer' waarden bevat die altijd aanwezig en uniek zijn, dan kunnen na <code>
409+Als bijvoorbeeld het veld 'Integer' waarden bevat die altijd aanwezig en uniek zijn, dan kunnen na
412410
413411` FieldIndexName:='Integer';`
414412
415-</code> gegevens in de database file worden opgeslagen.
413+gegevens in de database file worden opgeslagen.
416414
417415Hiervoor kun je de ApplyUpdates method gebruiken.
418416
419417### Opmerkingen
420418
421419- 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.
422420- Een database file kan meerdere tabellen bevatten.
423421- Het is mogelijke meerdere datasets (met verschillende velden) te maken die dezelfde database tabel benaderen.
424422- 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.
425423- 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.
426424- 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.
427425
428426Een algemeen voorbeeld kan gevonden worden in de fpc/fcl/sqlite CVS directory.
429427
430428Luiz Américo pascalive(at)bol(dot)com(dot)br
431429
432430## Lazarus en MSSQL
433431
434432Wie schrijft mij?
435433
436434## Lazarus and Interbase / Firebird
437435
438436Zie [[Install Packages]]. Op deze pagina vind je een klein voorbeeld en bijbehorende uitleg over het verbinding met een IB of FB server.
439437
440438## Lazarus en dBase
441439
442440Tony Maro
443441
444442Kijk ook eens naar de aanzet voor een [[Lazarus Tdbf Tutorial|TDbf Tutorial page]]
445443
446444FPC bevat een simpel database component die qua functionaliteit is te vergelijken met het TTable component van Delphi. Dit component ("TDbf", ([TDbf Website](http://tdbf.sourceforge.net/))) 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.
447445
448446Het 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.
449447
450448Het 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.
451449
452450Voor 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.
453451
454452Als 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.
455453
456-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: <code>
454+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:
457455
458456`   Dbf1.FilePathFull = '/pad/naar/mijn/database';`\
459457`   Dbf1.TableName = 'dvds';`\
460458`   With Dbf1.FieldDefs do begin`\
461459`       Add('Name', ftString, 80, True);`\
462460`       Add('Description', ftMemo, 0, False);`\
463461`       Add('Rating', ftString, 5, False);`\
464462`   end;`\
465463`   Dbf1.CreateTable;`
466464
467-</code> 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.
465+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.
468466
469467### Het maken van een index
470468
471-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: <code>
469+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:
472470
473471`   Dbf1.Exclusive := True;`\
474472`   Dbf1.Open;`\
475473`   Dbf1.AddIndex('dvdsname','Name',[ixPrimary, ixUnique, ixCaseInsensitive]);`\
476474`   Dbf1.AddIndex('rating.ndx', 'Rating', [ixCaseInsensitive]);`\
477475`   Dbf1.Close;`
478476
479-</code> 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.
477+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.
480478
481479Ik 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!
482480
483481## Vertalingen van deze pagina
484482
485483[[Lazarus Database Tutorial]] Het origineel.\
486484[[Lazarus Database Tutorial/es|Spaans]] door Eduardo Lopez (thanks! :)
487485
488486## Gerelateerde Links
489487
490488[[Databases|Creating Databases Applications with Lazarus using the DB-unit]]\
491489[[MySQLDatabases|Creating a database application using MySQL]]\
492490[[Zeos tutorial|Creating a database application using the Zeos components]]
493491
494492---
495493*From the Free Pascal wiki, page "Lazarus Database Tutorial/nl", as it stood on 2011-08-03 after a change by Chronos, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
496494Category: Databases/nl

Back to history