dBase bestanden, en een aantal clone varianten van dit formaat, wordt al jaren gebruikt en is zeker geen onbekende voor ontwikkelaars die tools zoals Delphi en Lazarus Pascal gebruiken.
Soms kan het echter voorkomen dat je de data van een DBF bestand niet kunt benaderen, b.v. door een afwijkend DBF formaat.
In dit artikel, gesponsord door Devart, laten we zien hoe de data terug kunt halen met UniDAC.
Merk op: ik heb in het verleden producten van Devart gebruikt, en met name MyDAC (database access voor MySQL), en kan alleen maar zeggen dat hun producten snel, betrouwbaar en flexibel zijn – aanrader dus.
Merk wel op dat de Devart componenten commerciële producten zijn, maar en is een Trial versie beschikbaar (zonder beperkingen) en er is een helemaal gratis Express versie beschikbaar (met wat limitaties voor wie commerciële producten maakt). Hoe dan ook: ik kan hun producten zeer aanraden. Een aantal Devart producten (met name database producten) zijn niet alleen voor Windows geschikt, maar ook voor software ontwikkeling m.b.t. macOS applicaties en andere plattformen.
dBase (dbf) bestanden
Een DBF bestand (.dbf) is standaard database bestandsformaat, welke oorspronkelijk gebruikt werd in combinatie met dBase, en is een van de eerste succesvolle database management systemen welk in 1979 beschikbaar kwam voor de PC. Het was een van de meest gebruikte en meest succesvolle database systemen, en wordt tegenwoordig nog staat actief gebruikt en ontwikkeld.
Naast een database engine, heeft dBase ook een query systeem, een forms engine, en zelfs een eigen programmeertaal.
In de loop van de tijd, met name door de dBase populariteit, kwamen er steeds meer zogenaamde dBase close, welke xBase databases werden genoemd omdat ze hun data in het .dbf file formaat werd opgeslagen. Er is een grote lijst met clones, om er een paar te noemen: FoxPro2, Visual FoxPro, dBase varianten, Clipper, CodeBase, Hiper-Six, en vele anderen.
Aan de slag met Embarcadero Delphi … gratis …
Voor wie interesse heeft in Delphi: Embarcadero heeft een zogenaamde Delphi Community edition beschikbaar, welke gratis is. Deze versie kan alles wat de standaard commerciële versie kan, maar er zijn wel beperkingen voor wie commerciële applicaties ontwikkeld.
Ad Blocking Gedetecteerd Vriendelijk verzoek om te overwegen Ad Blocking uit te zetten voor onze website.
We zijn afhankelijk van inkomen uit Advertenties om de website te kunnen draaien.
Je kunt ons ook op andere manieren ondersteunen (zie Ondersteun ons links bovenin).
Met UNIDac dBase data terughalen
Al deze verschillende varianten heeft er wel toe geleid dat er incompatibiliteitsproblemen ontstonden. Met name omdat de clone formaten bijvoorbeeld incompatibele data formaten toe hadden gevoegd.
Ontwikkelaars van Delphi database applicaties kunnen deze problemen voorkomen en/of omzeilen door een aantal speciale opties in Universal Data Access Components (UniDAC). Deze opties zijn IgnoreDataErrors en IgnoreMetaDataErrors.
De eerste optie, IgnoreDataErrors, ondersteund het werken met mogelijk corrupte DBF bestanden. Een DBF tabel heeft een “header” en een “data” sectie; De header bevat de metadata van de tabel. Zowel dBase als de verschillende clones, werden verder ontwikkeld, en nieuwe varianten van het DBF bestandsformaat kwamen beschikbaar. Zoals eerder genoemd, bijvoorbeeld dBase III, dBase IV, dBase V, dBase VII, dBase 10, dBase voor Windows, HiPer-Six, FoxPro 2, en Visual FoxPro. Iedere variant kwam weer met “verbeteringen” en dus veranderingen.
dBase is overigens nog steeds een commercieel product (Zie: http://www.dbase.com/dbasesql/). Het huidige bedrijf heeft echter alleen de tabelstructuur vanaf dBase VII openbaar gemaakt. UniDAC is echter zo geschreven dat het met deze varianten verweg kan, of je nu direct een DFB bestand benaderd of via ODBC – je hoeft je niet te verdiepen in de details.
Hieronder een overzicht van het dBase III — dBase V formaat (bron):

dBase file formaat
Zoals eerder vermeld, DBase is een commercieel product en informatie m.b.t. formaten die ouder zijn dan dBaseVII zijn dus niet beschikbaar. Alle formaat beschrijvingen die je online kunt vinden zijn dus geen officiële beschrijving van het formaat, en een verzameling van trial en error. Dit heeft als gevolg dat het kan voorkomen dat een DBF bestand niet helemaal correct is opgebouwd – wat dus complicatie kan geven als je de data met jouw eigen programma wilt benaderen.
Hier een voorbeeld van een dBaseIII tabel met meer dan 3700 gedetailleerde parameter records. In eerste instantie lijkt alles correct, zoals we zouden kunnen zien in een hexadecimale editor:

dBaseIII records voorbeeld
Let op de offset 240h welke rood is gemarkeerd.
Dit is waar de header van het dBase bestand eindigt en de data sectie (records) begint. Omdat we ons nog niet bewust zijn van problemen, zal een software ontwikkelaar de standaard parameters voor het TUniConnection component gebruiken met onderstaande code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| uses
Uni,
UniProvider,
ODBCUniProvider,
DBFUniProvider;
...
procedure TForm2.FormCreate(Sender: TObject);
begin
UniConnection1.Close();
UniConnection1.Provider := 'DBF';
UniConnection1.Database := 'c:\data';
UniConnection1.Open();
end; |
Merk op: In bovenstaand voorbeeld gaan we uit van een Windows applicatie waarbij de data directory op de C drive staat.
Uiteraard weten we al dat er iets goed mis is met het bestand. Specifieker gezegd: de kolom definitie in de header komt niet overeen met de data. Bijvoorbeeld: Er is float data opgeslagen in een integer kolom, de waarde 00000000 is blijft opgeslagen in een datum kolom, etc.
Vergeet overigens niet dat het bestand ook om andere redenen corrupt kan zijn. Bijvoorbeeld door het schrijven van data naar de disk terwijl de stroom uitvalt. Misschien is dit niet iets wat vaak bij jou thuis gebeurt (in Nederland zie ik dit super zelden) maar in andere gebieden is het niet ongebruikelijk (bijvoorbeeld in the VS, en zelfs in grote steden zoals Houston).
Omdat er best veel records in de tabel staan, is het uitplukken van individuele data records niet echt een optie, even los van hoeveel moeite het kost om specifieke records te vinden. Handmatig, b.v. met een hexadecimale editor, is ook geen optie, en het kan het probleem zelfs groter maken dan het al was.
Toch bij de data komen …
De standaardinstelling voor UniDAC is om gewoon alle records op te halen. Mocht jouw DFB bestand, zoals in ons voorbeeld, corrupt zijn, dan kun je onderstaande foutmelding verwachten. Per UniDAC versie, en per DFB bestand, kan de foutmelding iets anders zijn – maar je snapt het idee:

DBF- UniDAC foutmelding
In een dergelijk situatie kun je de IgnoreDataErrors optie gebruiken als workaround.
Bij corrupte bestanden is het zelfs erg waarschijnlijk dat je het bestand niet eens op een andere manier kunt openen.
Een voorbeeld van de code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| uses
Uni,
UniProvider,
ODBCUniProvider,
DBFUniProvider;
procedure TForm2.FormCreate(Sender: TObject);
begin
UniConnection1.Close();
UniConnection1.SpecificOptions.Values['IgnoreDataErrors'] := 'True';
UniConnection1.Database := 'c:\data';
UniConnection1.Open();
end; |
Je kunt dit natuurlijk ook de object properties instellen van het UniConnection1 component (dubbel klik – de naam van jouw component kan natuurlijk anders zijn – we refereren hier dus naar een TUniConnection component).
In Delphi, op jouw DataModule of Form, schakel je naar de Options tab, zet de Provider naar DBF, en zet de optie IgnoreDataErrors op True, zoals je hieronder ziet:

UniDAC connectie met opties
Ad Blocking Gedetecteerd Vriendelijk verzoek om te overwegen Ad Blocking uit te zetten voor onze website.
We zijn afhankelijk van inkomen uit Advertenties om de website te kunnen draaien.
Je kunt ons ook op andere manieren ondersteunen (zie Ondersteun ons links bovenin).
En als dat niet werkt …
Nu kan het zijn dat we nog steeds de tabel niet kunnen openen. Mocht dit het geval zijn, probeer dan ook de optie IgnoreMetaDataErrors, wat er voor zorgt dat UniDAC de metadata foutmeldingen negeert – een andere veel voorkomend probleem bij het gebruik van DBF bestanden, zeker als de DBF bestanden van andere applicaties komt.
Een ander tip, is het voorkomen van foutmeldingen als een DBF tabel NULL waarden heeft in een kolom waar NULL niet is toegestaan. In dat geval is de optie AllFieldsAsNullable handig bij het terughalen van data.
Ik heb best wat tijd besteed aan het oplossen van de problemen met het betreffende DBF bestand – en het kan knap lastig zijn om te bepalen wat nu het echte probleem is. De IgnoreDataErrors optie maakte het echter mogelijk dat ik de tabel wel kon openen.
Iets wat je wel in de gaten moet houden is omdat de data corrupt is, het dus soms onmogelijk kan zijn voor UniDAC om te bepalen wat het data type nu had moeten zijn. Om zo een probleem op te lossen, kun je misschien het beste een lege tabel maken met dezelfde structuur, en de data dan met een TUniLoader of TCRBatchMove component te kopiëren naar de nieuwe tabel.
Platform ondersteuning …
UniDAC ondersteund meerdere target platformen: Je kunt hiermee dus database applications maken voor Windows (32-bit en 64-bit), macOS (32-bit en 64-bit), iOS (32-bit en 64-bit), Android (32-bit en 64-bit), en Linux (32-bit en 64-bit).
Omdat UniDAC ook beschikbaar is voor Lazarus Pascal, hoop ik in de toekomst hier meer over te schrijven.
Reacties
Er zijn nog geen reacties geplaatst.
Je kunt jouw eigen opmerkingen plaatsen m.b.v. dit formulier, of een reactie op een bestaande opmerking plaatsen door op de "Beantwoorden" knop te klikken.