![]() |
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. |
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. |
AW: Daten von einer Datanbank in eine ander Datenbank kopieren
In IBExert kann man die Metadaten und Daten in ein Skript exportieren.
|
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 |
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:
Kann ich die Datensätze alle auf einmal löschen ? Momentan mache ich es einzelen um dann zu exportieren
arithmetic exception, numeric overflow, or string truncation.
Cannot transliterate character between character sets. Tanja |
AW: Daten von einer Datanbank in eine ander Datenbank kopieren
Zitat:
SQL-Code:
Aber willst du wirklich alle Datensätze in der Tabelle löschen?
DELETE FROM Table [WHERE PrimaryKey = XYZ]
|
AW: Daten von einer Datanbank in eine ander Datenbank kopieren
Zitat:
Wenn Du es an einem zeichen fest machen könntest dann wäre
SQL-Code:
ene Möglichkeit (## ist der Dezimalwert des fehlerhaften Zeichen)
delete from mytable where myfield like '%'||chr(##)||'%';
Gruß K-H |
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.
|
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:
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.
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; |
AW: Daten von einer Datanbank in eine ander Datenbank kopieren
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz