Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Einfügen über externalTabelle funktioniert nicht richtig (https://www.delphipraxis.net/179327-einfuegen-ueber-externaltabelle-funktioniert-nicht-richtig.html)

blutigerAnfänger 27. Feb 2014 08:59

Datenbank: firebird • Version: 2 • Zugriff über: IB Komponente

Einfügen über externalTabelle funktioniert nicht richtig
 
Hallo

ich möchte eine external Tabelle in eine Firebird Tabelle überführen. Der Quelltext den ich mir zusammengestückelt habe funktioniert fehlerfrei(laut Compiler). Das Ergebnis ist niederschmetternd.

Es gibt keine Feldtrennung, jeweils 2 Buchstaben verschwinden(egal ob Feld1 od.Feld2), Datensatzendezeichen werden nicht erkannt.
Delphi-Quellcode:
procedure TForm1.btn2Click(Sender: TObject);
begin
//IBDatabase1.DatabaseName := 'c:\db\test.fdb';
  with IBQuery1 do
   begin
      Active:=False;
      sql.Clear;
      sql.Text := 'DROP TABLE tabelle2' ;
      Active:=true;
      IBTransaction1.Commit;
      sql.clear;
      Active:=false;
      sql.text := 'CREATE TABLE TABELLE2 (FELD001 VARCHAR(50) CHARACTER SET ISO8859_1 COLLATE DE_DE, FELD002 VARCHAR(250) CHARACTER SET ISO8859_1 COLLATE DE_DE)';
      Active:=true;
      IBTransaction1.Commit;
   end;
ibdb1.Close;
end;


procedure TForm1.btn3Click(Sender: TObject);
begin
  with IBQuery1 do
   begin
      Active:=False;
      sql.Clear;
      sql.Text := 'Create TABLE dat_ext external file''c:\externalTables\Tabelle2.txt''(feld001 varchar(50),feld002 varchar(250), crlf smallint )';
      Active:=true;
      IBTransaction1.Commit;
   end;
end;

procedure TForm1.btn4Click(Sender: TObject);
begin
  with IBQuery1 do
   begin
      Active:=False;
      sql.Clear;
      sql.Text := 'Insert into Tabelle2 SELECT FELD001 , FELD002  from dat_ext ';
      Active:=true;
      IBTransaction1.Commit;
   end;
end;

procedure TForm1.btn5Click(Sender: TObject);
begin
  with IBQuery1 do
   begin
      Active:=False;
      sql.Clear;
      sql.Text := 'drop table dat_ext ';
      Active:=true;
      IBTransaction1.Commit;
   end;
end;
Der Quelltext sieht zwar nicht sehr vertrauenserweckend aus, aber er läuft.

Ich habe mehrere Möglichkeiten für crlf gefunden, hier als smallint aber auch char(2) ist möglich. Verwirrend!
Code:
  ... TABLE dat_ext external file''c:\externalTables\Tabelle2.txt''(feld001 varchar(50),feld002 varchar(250), crlf smallint )';
Völlig egal ob smallint oder Char(2), das Ergebnis ist dasselbe.

Ich hoffe ihr könnt mir helfen.

jobo 27. Feb 2014 09:23

AW: Einfügen über externalTabelle funktioniert nicht richtig
 
Kann man bei firebird keine Zeilentrennzeichen definieren?
Weißt Du, welche es wirklich sind? Stammt das File aus einem Unix oder (Win-)DOS System?
Würde ich mal mit Hex Editor untersuchen und das Manual von external Tables studieren.

borwin 27. Feb 2014 10:21

AW: Einfügen über externalTabelle funktioniert nicht richtig
 
... so auf die Schnelle eine Hinweiss.
Der Import verlangt immer feste Längen. Das geht am besten mit CHAR Feldern.
Dort werden immer Werte mit der definierten Länge eingetragen. Rest wird mit Leerzeichen aufgefüllt
Auch das Feld crlf muss ein Charfeld sein.

Gruß
Borwin

Perlsau 27. Feb 2014 12:09

AW: Einfügen über externalTabelle funktioniert nicht richtig
 
@blutigerAnfänger:

Ich hab da ein paar Fragen zu deinem Problem:

1. Was ist eine "external Tabelle"? Meinst du eine Tabelle in einem anderen DMBS?

2. Wenn sich diese "external Tabelle" in einem anderen DMBS befindet, kannst du mit deiner Delphi-Anwendung darauf zugreifen?

3. Wenn sich diese "external Tabelle" in einem anderen DMBS befindet, kannst du mit einem entsprechenden Dateimanager diese Tabelle exportieren, z.B. als CSV-Datei?

4. Wieso verwendest du in deiner Anwendung nicht aussagekräftige Bezeichner? Button1 sagt überhaupt nichts darüber aus, wozu der Button verwendet wird. Dasselbe gilt für deine Spalten-Bezeichner in der Datenbank. Durch die Verwendung sog. sprechender Bezeichner erhöhst du die Übersicht und Lesbarkeit deines Quellcodes.

Perlsau 27. Feb 2014 12:13

AW: Einfügen über externalTabelle funktioniert nicht richtig
 
Zitat:

Zitat von borwin (Beitrag 1249815)
... so auf die Schnelle eine Hinweiss.
Der Import verlangt immer feste Längen. Das geht am besten mit CHAR Feldern.
Dort werden immer Werte mit der definierten Länge eingetragen. Rest wird mit Leerzeichen aufgefüllt
Auch das Feld crlf muss ein Charfeld sein.

Verstehe ich nicht: Wenn ich in Firebird Daten aus einem anderen DMBS importieren muß, mache ich das mit einem SQL-Script, entweder direkt aus der Delphi-Anwendung heraus oder eben mit IbExpert (kostenlos in der Personal-Version). Da braucht's kein Auffüllen mit Leerzeichen; die Daten werden genau so in die Firebird-DB eingetragen, wie sie im Quell-DMBS vorliegen.

mkinzler 27. Feb 2014 12:13

AW: Einfügen über externalTabelle funktioniert nicht richtig
 
Zitat:

1. Was ist eine "external Tabelle"? Meinst du eine Tabelle in einem anderen DMBS?
Eine externe Datei, welche wie als Tabelle eingebunden wird und auf die man per SQL-Befehle (meist lesend) zugreifen kann.

Perlsau 27. Feb 2014 12:17

AW: Einfügen über externalTabelle funktioniert nicht richtig
 
Zitat:

Zitat von mkinzler (Beitrag 1249839)
Zitat:

1. Was ist eine "external Tabelle"? Meinst du eine Tabelle in einem anderen DMBS?
Eine externe Datei, welche wie als Tabelle eingebunden wird und auf die man per SQL-Befehle (meist lesend) zugreifen kann.

Du meinst, man kann in eine Firebird-DB eine externe Datei einbinden, die dann von der Anwendung, die auf diese Datenbank zugreift, als gewöhnliche Tabelle angesehen wird?

mkinzler 27. Feb 2014 12:20

AW: Einfügen über externalTabelle funktioniert nicht richtig
 
Jein, man kann mit dieser Tabelle nicht alles machen; es gibt bestimmte Einschränkungen

Perlsau 27. Feb 2014 12:31

AW: Einfügen über externalTabelle funktioniert nicht richtig
 
Zitat:

Zitat von mkinzler (Beitrag 1249844)
Jein, man kann mit dieser Tabelle nicht alles machen; es gibt bestimmte Einschränkungen

Und schon wieder was dazugelernt: Von diesen external Tables hatte ich bislang noch nichts gehört. Nun hab ich aber einen (älteren) Text gefunden, der das erklärt.

blutigerAnfänger 27. Feb 2014 13:30

AW: Einfügen über externalTabelle funktioniert nicht richtig
 
In der Zwischenzeit habe ich mir IBExpertPersonal aufgespielt und festgestellt:
1. Die externe Datei wird erstellt und befüllt.
2. Die Zieltabelle (Tabelle2) wird ordnungsgemäß befüllt(mit dem Mist der in der externen Datei steht.)

Zu 1. habe ich ein schematisches Beispiel:
original
Code:
AAAAA  {45 Leerzeichen}  BBBBB {245 Leerzeichen}  Zeilenende
in externer Datei
Code:
AAA   {43 Leerzeichen}   BB {8 Leerzeichen} Spaltentrenner(IBExpert) B {240 Leerzeichen}  Zeilenende

A steht für den zB.Buchstaben aus dem String in Feld 1
B analog
Wie man an der Zahl der As und Bs erkennt werden Buchstaben verschluckt.

Also ist offensichtlich bei der Überführung in die externe Datei bereits ein Fehler aufgetreten.
Mir ist aber keine andere Möglichkeit bekannt um mit externen Dateien zu arbeiten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:07 Uhr.
Seite 1 von 5  1 23     Letzte »    

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