Mein Vorgehen bei so 'nem Problem wäre folgendes:
Zuerst versuchen, aus den Tabellen Insertstatements zu erstellen. Dabei werden Fehler protokolliert.
Die Insertstatments können dann per Datei in 'ne andere Datenbank übernommen werden.
Für die protokollierten Fehler systematisch prüfen, was da falsch ist. Tritt z. B. immer die gleiche Fehlermeldung auf und das auch noch bei der gleichen Spalte?
Dann prüfen, wer denn da diese fehlerverursachenden Werte in die Tabelle "reinhaut" und dem ein paar um die "Löffel" geben
Habe mal ca. 14 Tage nach einem Datenfehler gesucht, der nur sporadisch auftrat. Mit 'ner Methode, wie der folgenden bin ich dann dahinter gekommen, dass irgend wer es geschafft hatte in ein Datumsfeld den 31.04.2003 hineinzubekommen.
(Der Quelltext ist nur hingedattelt und weder kompiliert noch getestet worden - ist halt nur so 'ne Idee)
Delphi-Quellcode:
procedure InsertDateienErstellen(sTabelle :
String; sIDSpalte :
String);
const
ciInsertsProDatei = 1000;
var
i : Integer;
k : Integer;
sInsert :
String;
sValues :
String;
sl : TStringList;
slFehler: TStringList;
bFehler : Boolean;
begin
sl := TStringList.Create;
slFehler := TStringList.Create;
k := 0;
qry.Close;
qry.Sql.Text := Format('
Select * from %s order by %s',[sTabelle,sIDSpalte]);
qry.Open;
// Wenn's hier schon kracht, hab' ich auch keine gescheite Idee :-(
sInsert := Format('
insert into %s (',[sTabelle]);
for i := 0
to qry.Fields.Count - 1
do begin
if i := qry.Fields.Count - 1
then begin
sInsert := sInsert + qry.Fields[i}.FieldName + '
) values (';
end else begin
sInsert := sInsert + qry.Fields[i}.FieldName + '
, ';
end;
end;
while not qry.Eof
do begin
sValues := '
';
bFehler := False;
for i := 0
to qry.Fields.Count - 1
do begin
try
// Hier könnte man noch abhängig vom DataType entscheiden,
// ob die Ausgabe mit QuotedStr oder ohne QuotedStr erfolgen soll / muss.
// Blobfelder dürften hierbei eh etwas "schwierig" werden ;-)
if i := qry.Fields.Count - 1
then sValues := sValues + QuotedStr(qry.Fields[i}.AsString) + '
);'
else sValues := sValues + QuotedStr(qry.Fields[i}.AsString) + '
, ';
except
on e :
Exception do begin
slFehler.Add(Format('
%s: %s',[sIDSpalte, qry.FieldByName(sIDSpalte).AsString]));
slFehler.Add(Format('
Spalte: %s',[qry.Fields[i].FieldName]));
slFehler.Add((e.
Message);
bFehler := True;
end;
end;
end;
if not bFehler
then begin
sl.Add(Format('
%s%s',[sInsert,sValues]));
end;
Inc(k);
if k
mod ciInsertsProDatei = 0
then begin
sl.Add('
Commit;');
sl.SaveToFile(Format('
Insert_%s_%0.9d',[sTabelle,k]);
sl.Clear;
end;
qry.Next;
end;
qry.Close;
slFehler.SaveToFile(Format('
Datenfehler_Tabelle_%s',[sTabelle]));
sl.SaveToFile(Format('
Insert_%s_%0.9d',[sTabelle,k]);
slFehler.Free;
sl.Free;
end;
Insgesamt sieht mir die Fehlermeldung sehr danach aus, dass da was in den Tabellen steht, was mit dem verwendeten CharSet nicht so wirklich kompatibel ist.