Bob Swart (aka Dr.Bob)
Eenzame ClientDataSets

De TClientDataSet component is - zoals wellicht bekend - een onderdeel van MIDAS, maar kan ook als losstaand component gebruikt worden (waarbij dus geen MIDAS licentie verschuldigd is bij deployment). En alhoewel MIDAS momenteel nog slechts onderdeel van de Enterprise edities van Delphi en C++Builder is, zal het naar verluid ook al in Kylix (Delphi for Linux) Professional en straks ook in Delphi 6 Professional zitten. Waarschijnlijk zonder de vele remote connection features (die komen dan in weer in de Enterprise edities te zitten), maar wel met iets dat op z'n minst erg zal lijken op de ClientDataSet component.

Zero Configuration Client
Een van de voordelen van het gebruik van MIDAS is dat we geen database drivers meer hoeven te installeren op de clients. Geen BDE, geen ODBC, helemaal niks van dat alles. Helemaal niks? Welnu, een kleine nederzetting toch wel, namelijk de MIDAS.DLL (die moet in je Windows System directory komen). Deze MIDAS.DLL bevat alle functionaliteit van de ClientDataSet component die we binnen dit artikel gaan gebruiken. En zolang de data niet van de ene client machine naar de andere gaat, zijn we ook inderdaad geen MIDAS licentie verschuldigd.

Lokale versie
Alhoewel de ClientDataSet component met name bedoeld is om zijn data van DataSetProviders te betrekken, kunnen we hem evengoed (en gratis) als "lokale" dataset gebruiken. De vraag is natuurlijk hoe we dan data in de ClientDataSet kunnen krijgen. Dit kan op een aantal manieren. De eerste manier is door een bestaande DataSet component te gebruiken die al data bevat. Dit kan zowel een tabel of een query zijn, die tijdens design-time beschikbaar en Active is. Door vervolgens met de rechtermuisknop op de ClientDataSet te klikken en te kiezen voor de menu-optie "Assign Local Data" krijgen we een lijst met alle datasets (tabellen of queries) die beschikbaar zijn op dit form of data module. In het plaatje kies ik voor TableCustomer.

Het gevolg van deze keuze is dat de data in TableCustomer nu ook in ClientDataSet staat. Waar dan, zul je vragen? Wel, in het geheugen van je machine, want ClientDataSet doet alles in memory (en een thin-client wil dus niet noodzakelijkerwijs zeggen dat je ook weinig intern geheugen nodig hebt).
Zodra de data van de dataset (in dit geval TableCustomer) naar de ClientDataSet is overgezet, is de oorspronkelijke dataset niet meer nodig, en die kan van de data module verwijderd worden. Let wel op dat je dan meteen de DBTables unit ook uit de uses clause (van het interface) haalt, anders heb je nog steeds de BDE nodig (en dat was juist een van de voordelen van MIDAS - geen BDE meer op de client).

De DFM file van de data module is meteen een stukje groter geworden. Als we daarin kijken (tegenwoordig staan ze al by default in tekst formaat op disk), dan zie je dat de Data property van de ClientDataSet van binary waarde is voorzien. Dit is de interne waarde, en bevat zowel meta data (zoals veldnamen) als actuele data (de records met hun waarden).
We kunnen nu via een DataSource component de ClientDataSet aan data-aware componenten koppelen, zoals bijvoorbeeld een DBGrid. Dat werkt verder precies zoals we gewend zijn met gewone datasets.

Tijdens design-time zie je alle data in het DBGrid verschijnen. Het gekke is echter dat als we een data module gebruiken met een ClientDataSet erop dat gebruikt wordt in een ander Form, dat we dan tijdens run-time geen data zien. Het grid blijft leeg, en de data in de ClientDataSet is om de een of andere reden weer weg. Als we de ClientDataSet oppakken en op het form zelf neerzetten dan werkt het wel, en zien we ook alle records tijdens run-time.

Alhoewel het nuttig kan zijn om op deze manier een ClientDataSet van waarde te voorzien, zal het ook noodzakelijk zijn om wijzigingen op te slaan. Tot nu toe hebben we lokale data in de ClientDataSet geplaatst, maar op nog geen enkele voorzieningen getroffen op wijzigingen in deze data op te slaan. Een ClientDataSet component heeft daarvoor de SaveToFile en LoadFromFile methods, net als de SaveToStream en LoadFromStream methods.
Voordat je nu meteen deze routines uitprobeert, is het handig om eerst eens te kijken naar de FileName property. Als we daar een waarde in zetten (zoals bijvoorbeeld customer.cds), dan zal de inhoud van de ClientDataSet automatisch worden opgeslagen (en ingelezen) in en van dit bestand. Uitermate handig. Je kan ook een .xml bestandnaam geven, en dan wordt de data in XML formaat bewaard (en weer ingelezen dus). Zodra je de applicatie opstart zal hij eventuele data uit deze FileName inlezen, en bij afsluiten meteen weer wegschrijven. Zo heb je zonder één regel code te schrijven een database toepassing waarbij je behalve je executable alleen nog de MIDAS.DLL nodig hebt (maar zonder licentiekosten). En dat zonder een regel code te schrijven.

Meer Informatie
Mocht iemand nog vragen, opmerkingen of suggesties hebben, dan hoor ik die het liefst via . Voor meer informatie verwijs ik daarnaast graag nog naar mijn Delphi Clinic over ClientDataSets, dbExpress en DataSnap.


This webpage © 1999-2006 by webmaster drs. Robert E. Swart (aka - www.drbob42.com). All Rights Reserved.