Stel: Er is een bak met informatie zonder enige structuur en dit moet worden geconverteerd naar een Microsoft Access bestand met gevulde tabellen.
Stel: Er is geen Access geinstalleerd op de PC waar dit geregeld moet worden
Vraag: Wat doe je dan?
Antwoord: Je zou gebruik kunnen maken van de standaard ADO componenten in Delphi.
Eigenlijk is dat niet helemaal waar, maar wel ADO en ook Delphi. Naast de standaard ADO componenten is er ook nog een toevoeging op ADO, namelijk ADOX. Deze is standaard niet te benaderen, maar je kan hem wel gebruiken. Met ADOX kun je zonder dat daarbij COM/OLE gebruikt hoeft te worden. Voor het toevoegen van ADOX aan je project moet een type library worden geimporteerd.
Voor Delphi 2005 gaat dat via de onderstaande stappen:
- Klik op Component en kies import component uit het menu.
- In de wizard kies voor “import type library”
- Klik op “Next” om verder te gaan.
- Kies uit de lijst “Microsoft ADO Ext. 2.x for DDL and Security.
- Klik op “Next” laat de instellingen hier zoals ze zijn,
- Klik op “Next” en kies Add Unit to [projectnaam]“.
- Klik nu op Finish om de unit te maken en direct toe te voegen aan het project.
Voor het maken van een Access bestand moeten we gebruik maken van het object TCatalog. Deze is te vinden in de ADOX_TLB.pas, dit is de type library die we net hebben geimporteerd. De eerste stap is het definieren van een nieuwe variabele van het type TCatalog.
catAccess : TCatalog;
Natuurlijk is defnieren niet genoeg, omdat het een object is moeten we deze ook creeeren.
catAccess := TCatalog.Create(self);
Nu hebben we een catalog, echter moeten we er nog wel zinnige informatie uit zien te krijgen. Net als bij andere ADO componenten kunnen we ook hier gebruik maken van een connection string Hiermee wordt aangegeven met welk type database en met welke database verbonden moet worden. Voor Access wordt gebruik gemaakt van de Jet OLEDB driver. De naam voor het Access bestand mag zelf worden gekozen, natuurlijk wel een volledg pad op geven.
sAccessBestandsnaam := ‘C:\Data\MyAccessFile.mdb’;
Eventueel kun je nog een versie meegegeven aan de Access bestand. In dit geval hebben we gekozen voor versie 4 (Access 97). Al deze informatie samen vormt je nieuwe connection string. Let erop dat je de puntkomma’s op de juiste plaats neer zet!
sDataSource := ‘Provider=Microsoft.Jet.OLEDB.4.0;Data Source=’ +sAccessBestandsnaam+ ‘;Jet OLEDB:Engine Type=4′;
Voor het maken van een Access bestand moet de Create1 van de Catalog worden aangeroepen. Deze zorgt ervoor dat het bestand ook daadwerkelijk wordt aangemaakt. Deze Create1 heeft dus niks te maken met de Create van de Catalog zelf.
catAccess.Create1(sDataSource);
Na het aanroepen van deze code wordt het Access bestand gemaakt. Maar een Access bestand zonder data is ook niet echt zinnig. Voor het maken van tabellen moeten we een verbinding maken met het zojuist gemaakte bestand. Dus op het Form van de applicatie plaatsen we een TADOConnection. De connectionsstring die we net hebben gemaakt kunnen we opnieuw gebruiken.
conAccess.ConnectionString := sDataSource;
conAccess.LoginPrompt := False;
Om tabellen te maken in het Access bestand hebben we ook een TADOCommand nodig. Deze plaatsen we ook op het form. Deze TADOCommand moet verbinding maken met het Access bestand, dus de connection moet de TADOConnection van hierboven worden.
comCreateAccess.Connection := conAccess;
In principe zouden we nu genoeg componenten hebben om een tabel te maken. Echter is het misschien handig om nog even een check te doen of de te maken tabel al bestaat. Hiervoor maken we gebruik van een TADODataset, deze staat ook als component op het form. Allereerst sluiten we deze dataset, just to be sure.
Vervolgens de OpenSchema aanroepen van de TADOConnection. Hieraan moet een schema aan worden meegegeven, in dit geval siTables (we zoeken een tabel) en we moeten een dataset meegeven om de resultaten in op te slaan. Hiervoor gebruiken we de dataset die we net hebben toegevoegd. Daarna de dataset openen
dstAccessTables.Close;
conAccess.OpenSchema(siTables,EmptyParam,EmptyParam,dstAccessTables);
dstAccessTables.Open;
De naam van de tabel die we willen maken definieren in een variabele
sTableName := ‘Klanten’;
De dataset wordt gevuld met de tabelnamen uit het Access bestand. Met een Locate op de dataset kunnen we controleren of de tabelnaam bestaat. We moeten een locate doen op het veld “TABLE_NAME”.
if not dstAccessTables.Locate(‘TABLE_NAME’,sTableName,[loCaseInsensitive]) then
Als de tabel niet is gevonden in de lijst met tabellen kunnen we de tabel maken. We maken hiervoor gebruik van de TADOCommand. Voor het maken van een tabel kunnen we standaard SQL gebruiken. Voor Access moeten wel andere velddefinities worden gebruikt. Om het makkelijk te houden worden de velden toegevoegd aan de TStringlist, slFields. Deze moet natuulijk ook worden gemaakt met een Create.
slField := TStringList.Create;
slFields.Add(‘ID AUTOINCREMENT’);
slFields.Add(‘NAAM TEXT(50)’);
slFields.Add(‘DATUM DATETIME’);
slFields.Add(‘KLANTNO NUMBER’);
slFields.Add(‘ACTIEF YESNO’);
Voor het maken van de tabel gebruiken we de TStringList voor de lijst met velden. Daarna de Execute aanroepen van de TADOCommand om de tabel te maken.
sCommandString :=’CREATE TABLE ‘+ sTableName +’ (‘ + slFields.CommaText + ‘)’;
comCreateAccess.CommandText := sCommandString;
comCreateAccess.Execute;
Nu hebben we een bestand met een tabel, meerder tabellen toevoegen kan op eenzelfde manier. Het enige wat er nu nog moet gebeuren is het vullen van de tabel met waarden. De TADOCommand kan hiervoor ook worden gebruikt. Net zoals bij de velden zijn ook de waarden toegevoegd aan een TStringlist. Omdat we in dit geval ook de kolommen nodig hebben wordt hiervoor ook een TStringList voor gebruikt. Beide moeten wel worden aangemaakt met een Create.
slColumns.Add(‘NAAM’);
slValues.Add(‘DTS bv’);
sCommandString := ’INSERT INTO ‘+ sTableName +‘ (‘+ slColumns.CommaText +’)'+‘ VALUES (‘+ slValues.CommaText +’)';
comCreateAccess.CommandText := sCommandString;
comCreateAccess.Execute;
Na het uitvoeren is er een tabel met data. Aan het einde van de procedure, functie of wat je ook gebruikt, wel netjes alle gebruikte TStringlist objecten weer opschonen. Niemand zit te wachten op geheugenlekken.

