Salut,
ich habe mal 'ne Frage...
Ich darf zur Zeit ein Progrämmchen entwickeln, das mir die Daten aus einer
Access-Datenbank in eine andere
Access-Datenbank migriert.
Da die neue Datenbank eine andere Struktur hat als die alte, suche ich mir Daten aus der alten Tabelle mittels SELECT Statement raus und bastele mir dann ein INSERT INTO Statement zusammen.
Das Problem liegt jetzt im Aufbau des INSERT Strings. Dafür verwende ich die folgende Prozedur:
Tabelle nimmt den Namen der Tabelle in die ich einfügen will auf, FelderAlt sind die Typen und Daten der alten
DB und FelderNeu die Namen der Neuen Felder.
Delphi-Quellcode:
BuildInsertString(Tabelle :
String; FelderAlt :
Array of TField; FelderNeu :
Array of String):
String;
var
Min : Integer;
Max : Integer;
i : Integer;
ResString :
String;
begin
Min := Low(FelderAlt);
Max := High(FelderNeu);
ResString := '
INSERT INTO '+Tabelle+'
(';
for i := Min
to Max-1
do
ResString := ResString + FelderNeu[i]+'
,';
ResString := ResString + FelderNeu[Max]+'
)';
ResString := ResString + '
VALUES (';
for i := Min
to Max
do
begin
case FelderAlt[i].DataType
of
// String-Type und Datum/Zeit Felder werden in " eingefügt
ftString, ftDate, ftTime, ftDateTime,
ftMemo, ftFmtMemo, ftFixedChar, ftWideString :
begin
If FelderAlt[i].IsNull
then
ResString := ResString + '
NULL,'
else
ResString := ResString + '
"' + FelderAlt[i].AsString+'
",';
end;
// Zahlwerte ohne "
ftSmallint, ftInteger, ftWord, ftFloat,
ftBytes, ftVarBytes, ftAutoInc, ftLargeInt :
begin
if FelderAlt[i].IsNull
then
ResString := ResString + '
NULL,'
else
ResString := ResString + FelderAlt[i].AsString+'
,';
end;
// Bool-Werte werden intern umgewandelt und dann als String ohne " eingefügt
ftBoolean :
begin
if FelderAlt[i].IsNull
then
ResString := ResString + '
NULL,'
else
ResString := ResString + BoolToStr(FelderAlt[i].AsBoolean)+'
,';
end;
else
raise Exception.Create('
Unbekannter Feldtyp '+FelderAlt[i].
Name);
end;
end;
Result := Copy(ResString,0,Length(ResString)-1);
Result := ResString + '
);';
end;
Da ich manche Felder aber nicht aus der alten
DB rausbekomme (Verweise etc.), wollte ich mir nun eigene Felder erzeugen, die ich mit als Übergabe verwenden kann.
Delphi-Quellcode:
var
IDField : TWordfield;
[...schnipp...]
IDField := TWordField.Create(Application);
IDField.AsInteger := Counter;
[...schnipp...]
BuildInsertString('T_Adressen',
[IDField,FieldByName('SSTRASSE'),FieldByName('SPLZ'),FieldByName('SORT'),
FieldByName('STELEFON'),FieldByName('SEMAIL'),FieldByName('SFAX'),
FieldByName('HANDY'),FieldByName('HSTRASSE'),FieldByName('HPLZ'),
FieldByName('HORT'),FieldByName('HTELEFON'),FieldByName('HFAX')],
['REF_PersonID','Strasse','PLZ','Ort','Telefon','EMail','Fax','Mobil',
'HeimStrasse','HeimPLZ','HeimOrt','HeimTelefon','HeimFax']);
IDField ist ein von mir erzeugtes Feld, das eine laufenden Nummer abhängig von der Nr. des Datensatzes erhält.
Und genau hier liegt das Problem. Ich kann nicht einfach so ein T(*)Field erzeugen, da dieses einem DataSet zugeordnet sein muß.
Allerdings kann der Aufruf von BuildInsertString auch nur mit Feldern aus der
DB erfolgen.
Meine Frage ist jetzt, wie kann ich mir manuell ein TField erzeugen, das möglichst nicht irgendwie an der
DB dranhängt ?
Grüße
Wolf
[EDIT]Zeilenumbrüche eingefügt[/EDIT]
Ein Schiff im Hafen ist sicher. Aber dafür werden Schiffe nicht gebaut. (engl. Sprichwort)