Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Daten von einer Datanbank in eine ander Datenbank kopieren (https://www.delphipraxis.net/190089-daten-von-einer-datanbank-eine-ander-datenbank-kopieren.html)

Dumpfbacke 29. Aug 2016 12:25

Datenbank: Firebird • Version: 2.5 • Zugriff über: IBX

Daten von einer Datanbank in eine ander Datenbank kopieren
 
Hallo Leute,
ich habe ein Problem. Es scheint eine Firebird Datenbank bei mir def. zu sein. Beim Insert dauert es Stunden für 100 Datensätze. Mit Gfix sehe ich das dort Fehler 12 + 5 vorhanden sind. Berichtigen tut Gfix es leider nicht. Ein Backup geht auch nicht mehr. Also habe ich eine neue Datenbank angelegt. Nur wie bekomme ich die Daten da rüber ? Ich wollte es mit IBExpert machen (Table Data Compaser). Leider ist die Datenbank etwas größer 15 GB. 5 Tabellern bekomme ich nicht rüber. Hier reicht der Speicher nicht. Kann mir jemand sagen wie ich es sonst noch machen kann ?

Danke Tanja.

Fritzew 29. Aug 2016 12:32

AW: Daten von einer Datanbank in eine ander Datenbank kopieren
 
Ich benutze IBexpert nicht mehr, aber wenn ich mich recht erinnere gibt es die Möglichkeit die Daten zu exportieren und importieren.
Also bestehende DB export und neue Db Import.

mkinzler 29. Aug 2016 12:46

AW: Daten von einer Datanbank in eine ander Datenbank kopieren
 
In IBExert kann man die Metadaten und Daten in ein Skript exportieren.

Dumpfbacke 29. Aug 2016 13:29

AW: Daten von einer Datanbank in eine ander Datenbank kopieren
 
Danke für den Tip. So komme ich weitere. Leider geht es auch noch nicht da ich Datensätzet mit Fehleren haben welche ich vorher löschen muss. Nun ja bin schon am löschen. Leider.

Danke noch mals Tanja

Dumpfbacke 29. Aug 2016 14:35

AW: Daten von einer Datanbank in eine ander Datenbank kopieren
 
Leider doch noch eine Frage. Ich kann leider nicht alle Datensätze exportieren, da ich immer eine Fehlermeldung erhalte.

Delphi-Quellcode:
arithmetic exception, numeric overflow, or string truncation.
Cannot transliterate character between character sets.
Kann ich die Datensätze alle auf einmal löschen ? Momentan mache ich es einzelen um dann zu exportieren

Tanja

Aviator 29. Aug 2016 14:57

AW: Daten von einer Datanbank in eine ander Datenbank kopieren
 
Zitat:

Zitat von Dumpfbacke (Beitrag 1346050)
Kann ich die Datensätze alle auf einmal löschen ? Momentan mache ich es einzelen um dann zu exportieren

SQL-Code:
DELETE FROM Table [WHERE PrimaryKey = XYZ]
Aber willst du wirklich alle Datensätze in der Tabelle löschen?

p80286 29. Aug 2016 14:58

AW: Daten von einer Datanbank in eine ander Datenbank kopieren
 
Zitat:

Zitat von Dumpfbacke (Beitrag 1346050)
Delphi-Quellcode:
arithmetic exception, numeric overflow, or string truncation.
Cannot transliterate character between character sets.
Kann ich die Datensätze alle auf einmal löschen ? Momentan mache ich es einzelen um dann zu exportieren

bei so einer Fehlermeldung gehen bei mir sämtliche Alarmglocken an. Solche Ungereimtheiten fallen ja nicht vom Himmel, sondern sind "hausgemacht". Meine erste Aktion wäre heraus zu bekommen, was da konkret schiefgelaufen ist, und dann wie man es bereinigen kann. Einfach löschen wäre mir zu wenig.

Wenn Du es an einem zeichen fest machen könntest dann wäre
SQL-Code:
delete from mytable where myfield like '%'||chr(##)||'%';
ene Möglichkeit (## ist der Dezimalwert des fehlerhaften Zeichen)

Gruß
K-H

Neumann 29. Aug 2016 15:58

AW: Daten von einer Datanbank in eine ander Datenbank kopieren
 
Wenn das IBexpert ist, dann darauf achten dass in den "Database Registration Infos" der richtige Charset eingestellt ist.

nahpets 29. Aug 2016 16:19

AW: Daten von einer Datanbank in eine ander Datenbank kopieren
 
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.

p80286 29. Aug 2016 16:46

AW: Daten von einer Datanbank in eine ander Datenbank kopieren
 
Die Infos dieser seite sind dir bekannt?

Gruß
K-H


Alle Zeitangaben in WEZ +2. Es ist jetzt 07:33 Uhr.

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf