Pagina1 van 1

Delphi – Beschadigde Data terug halen uit DBF Databases

Delphi – Beschadigde Data terug halen uit DBF Databases
   0

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. 

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

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

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

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

UniDAC connectie met opties

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.

Donatie opties


Donaties zijn niet verplicht maar worden wel zeer gewaardeerd. Donaties worden gebruikt voor de hosting kosten van onze website, en voor de aankoop van zaken die we in onze projecten gebruiken. Hoe klein de donatie ook is; we zijn er erg blij mee!

Please note that clicking affliate links, like the ones from Amazon, may result in a small commission for us - which we highly appreciate as well.

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.



Jouw Opmerking ...

Plaats hier geen lange bestanden (zoals source codes, log files of config files). Gebruik hiervoor het Forum.

Delen:
*
*
Laat me per email weten als er nieuwe reacties zijn.
       Je kunt jouw RSS reader gebruiken om reacties te volgen.


Tweaking4All gebruikt de gratis Gravatar dienst voor Avatar weergave.
Tweaking4All zal nooit jouw email adres met anderen delen.