|
Om gegevens van de ene naar de andere database over te pompen kun je
gebruik maken van de handige TBatchMove component (standaard te vinden op het
DataAccess tabblad).

Dit component heeft een 'source' en een 'destination' property die verwijzen
naar TTable componenten. Een andere belangrijke eigenschap is de 'Mode' welke
aangeeft wat er met de data en tabellen moet gebeuren ( bv. kopiëren of toevoegen ).
Door vervolgens de Execute procedure aan te roepen wordt de
opdracht uitgevoerd.
De volgende code kopieert de gehele inhoud van een database naar een andere
database.
Wat je nodig hebt:
- De volgende units in het 'uses' gedeelte;
Db, DBTables, BDE
- Een procedure om alle tabelnamen uit een database te extraheren:
procedure GetAllTables( lstTables: TStrings );
var
dbMain: TDatabase;
hCursor: hDBICur;
ListDesc: TBLBaseDesc;
begin
lstTables.Clear;
db1 := nil;
try
dbMain := TDatabase.Create(nil);
// Database eigenschappen
dbMain.DatabaseName := 'De naam van de source database';
dbMain.LoginPrompt := False;
dbMain.Connected := True;
Check(DbiOpenTableList(dbMain.Handle, False, False, '*', hCursor));
while (DbiGetNextRecord(hCursor, dbiNOLOCK, @ListDesc, nil)
= dbiErr_None) do
if not( ListDesc.bView )then // queries overslaan
lstTables.Add( ListDesc.szName );
dbiCloseCursor(hCursor);
db1.Connected := False;
except
dbMain.Free;
raise;
end;
dbMain.Free;
end;
De code van GetAllTables is grotendeels gepikt van:
www.latiumsoftware.com
- Uiteraard twee databases (ik heb ze dbSource en dbDest genoemd), twee TTable componenten
(tblSource en tblDest) waarbij deze uiteraard naar de gerelateerde database wijzen en een
TBatchMove (bmMain) waarbij de source 'tblSource', de destination 'tblDest' en
de Mode 'batUpdate' is.
De volgende procedure leest alle tabelnamen uit dbSource en kopieert alle data via de bmMain in dbDest.
procedure CopyDatabases;
var
lstTables: TStringList;
i: integer
begin
lstTables := TStringList.Create;
//even er van uit gaan dat in GetAllTables de gegevens van dbSource staan
GetAllTables( lstTables );
for i:=0 to lstTables.Count - 1 do
begin
try
tblSource.TableName := lstTables[i];
tblDest.TableName := lstTables[i];
bmMain.Execute; //de batchmove
except
on E:Exception do
begin
lstTables.Free;
Raise;
end;
end;
lstTables.Free;
end;
opmerking: Normaliter moet het kopiëren van de tabellen in de volgorde gebeuren
als de het sql script waarmee de database aangemaakt is. Dit is van belang om de koppelingen
in de database op orde te houden. In de praktijk betekent dit dat je een TStringList zult maken
waaraan je de tabelnamen handmatig toevoegd in de volgorde als in het sql script van de database
te vinden is.
|
|