Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#9

AW: Daten von einer Datanbank in eine ander Datenbank kopieren

  Alt 29. Aug 2016, 15:19
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.
  Mit Zitat antworten Zitat