Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Tabelle mit sql erstellen (https://www.delphipraxis.net/161553-tabelle-mit-sql-erstellen.html)

fl63 8. Jul 2011 14:27

Datenbank: firebird • Version: 2.5 • Zugriff über: zeos

Tabelle mit sql erstellen
 
Hallo!

Ich habe eine csv-Datei und wandele diese mit BDE in dbf Format.

Wie mache ich das mit Firebird?

mkinzler 8. Jul 2011 14:32

AW: Tabelle mit sql erstellen
 
-Insert-Skript erzeugen
-als externe Tabelle
-Batch-Move von einem JSV-DataSet

fl63 8. Jul 2011 14:55

AW: Tabelle mit sql erstellen
 
Zitat:

Zitat von mkinzler (Beitrag 1110817)
-Insert-Skript erzeugen
-als externe Tabelle
-Batch-Move von einem JSV-DataSet

???

Ich bin viel zu sehr Anfänger um zu wissen was damit gemeint ist.

Anbei erstmal meine Erstellungsfunktion:

Delphi-Quellcode:
procedure TForm5.Datenbank1erstellen();
var i: integer;
   SL: TStringlist;
begin
  with table1 do     //Benenne Datenbanktabelle
  begin
    Active := false;
    DataBaseName := 'C:\DB';
    TableName := 'Datenbank1.dbf';
{    TableType := ttDbase;}

    with FieldDefs do //Benenne Tabellenfeld
    begin
      Clear;
      Add('Datenwort', ftString, 50, false);
    end;

    CreateTable;     //Erzeuge Tabelle
    Open;            //Öffne Tabelle

    with table1 do    //Mache etwas mit Tabelle
    begin                 // Routine zum Einlesen der Daten
    SL:= TStringlist.Create;
    SL.LoadFromFile('C:\DB\datenw1.txt');
     Active := false;
     DataBaseName := 'C:\DB';
     TableName := 'Datenbank1.dbf';
     Active := true;
       For i := 0 to SL.Count -1 do
       begin
       Append;   // jeder Datensatz wird einzeln eingefügt (appended)
       Fields[0].AsString := SL.Strings[i];
       end;
     Post;
    end;
  Close;
  table1.Exclusive :=true;
    with IndexDefs do
    begin
      Clear;
      AddIndex('Datenwort' , 'Datenwort',[]);
    end;

  end; {allererstes with table1 do}
SL.Free;
end; {procedure TForm1.Tabelleerstellen1Click}
Kann man daran etwas verbessern? Ich bin dabei mein Programm auf Firebird umzustellen und möchte natürlich auch, daß das ganze schneller wird.

haentschman 8. Jul 2011 15:35

AW: Tabelle mit sql erstellen
 
Hallo...

das Prinzip ist im weitesten Sinne ähnlich.

1. Datenbank erstellen
2. Tabelle erstellen
3. Felder erstellen, Indexe anlegen
4. CSV einlesen (Stringlist)
5. Schleife über alle Einträge aus Pkt. 4
6. innerhalb der Schleife die Daten in die Datenbank per INSERT Statement (ggf. die Werte der Zeile aufsplitten und einzeln schreiben)

Hinweise:
- Pkt1-3 kann man auch vorher mit einem Tool wie IBExpert erledigen. Vorraussetzung, man weiß welche Felder die CSV Datei enthällt.

Fragen:
- Du sprichst von CSV lädst aber in deinem Beispiel eine TXT und liest nur die komplette Zeile ein. Eine Zeile eines CSV besteht aber in der Regel aus mehreren Werten.
- willst du mit jedem Import eine neue Tabelle / Datenbank erstellen ?
- sind die CSV vom Aufbau immer gleich ?

:hi:

PS: eine dbf ist keine Datenbank sondern nur eine Tabelle im "File Format". Hier hast du schon den Unterschied zu Firebird. Dort existieren keine Tabellen ohne Datenbank. Diese Datenbank ist ein File und enthällt mehrere Tabellen.

mkinzler 8. Jul 2011 15:38

AW: Tabelle mit sql erstellen
 
Die Datendefinition ist aber fix oder soll diese dynasmisch anhand der CSV-Datei erzeugt werden?

In FireBird kann man externe dateien als Tabellen einbinden und aus diesen dann daten kopieren.
http://www.janus-software.com/fbmanu...admin&topic=13

Mit Hilfe eines CSV-DataSets kann man eine CSV-Datei als Delphi-DataSet laden und dann delphiseitig die Daten in das mit Firebird verbundene DataSet kopieren.


http://fbexport.sourceforge.net/fbexport.html

haentschman 8. Jul 2011 15:45

AW: Tabelle mit sql erstellen
 
Der Vorteil des manuellen Imports über die Schleife (mag diese Variante auch langsamer sein) ist, daß man während der Übernahme Überprüfungen der Daten vornehmen kann (ungültige Werte, Schreibfehlerkorrektur etc.)

fl63 8. Jul 2011 16:04

AW: Tabelle mit sql erstellen
 
Zitat:

Zitat von haentschman (Beitrag 1110827)
Hallo...


Fragen:
- Du sprichst von CSV lädst aber in deinem Beispiel eine TXT und liest nur die komplette Zeile ein. Eine Zeile eines CSV besteht aber in der Regel aus mehreren Werten.
- willst du mit jedem Import eine neue Tabelle / Datenbank erstellen ?
- sind die CSV vom Aufbau immer gleich ?

- Die txt Datei ist in diesem Fall ein Ergebnis aus zwei Bearbeitungsschritten:

a) zweispaltige Open Office Datei als csv Speichern

1.Schritt: zweite Spalte innerhalb des Delphi Programms löschen,

2.Schritt: doppelte Begriffe entfernen.

b) Datenbanktabelle (dbf) mit obigen Quelltext erstellen.


- Ja, es soll jedesmal die komplette Tabelle neu erstellt werden.

- im nachhinein soll der Importvorgang auf 2 und mehr Spalten (csv) erweitert werden.

fl63

haentschman 8. Jul 2011 16:08

AW: Tabelle mit sql erstellen
 
Zitat:

Ja, es soll jedesmal die komplette Tabelle neu erstellt werden.
Kannst du den Sinn dahinter mal begründen ?
Eine Datenbank ist eine "Sammlung" von Daten aus der man sich das suchen lassen kann was benötigt wird. (macht die Ddatenbank) Wenn du jedesmal eine neue Tabelle / Datenbank erzeugst mußt du selbst nach den Daten suchen (anhand des Datenbank Namens z.B) Was ist wohl übersichtlicher und effektiver ? 8-)

fl63 8. Jul 2011 16:21

AW: Tabelle mit sql erstellen
 
Zitat:

Zitat von haentschman (Beitrag 1110834)
Zitat:

Ja, es soll jedesmal die komplette Tabelle neu erstellt werden.
Kannst du den Sinn dahinter mal begründen ?

Neue Datensätze (aus Open Office), werden bereits zwischen die alten Datensätze geschrieben.
zB. werden zwischen den 200sten und dem 201sten Datensatz zwei Neue eingefügt,was bei 1000 und mehr Datensätzen nicht zu erkennen ist.

mkinzler 8. Jul 2011 16:25

AW: Tabelle mit sql erstellen
 
Auch nicht anhand des Inhalts?

fl63 8. Jul 2011 16:32

AW: Tabelle mit sql erstellen
 
Zitat:

Zitat von mkinzler (Beitrag 1110839)
Auch nicht anhand des Inhalts?

Wie ist das bitte gemeint. Ich kann nicht feststellen an welcher Stelle der Tabelle sich etwas verändert hat. Ich sehe nur die zunehmende Gesamtzahl der Datensätze.

rollstuhlfahrer 8. Jul 2011 16:35

AW: Tabelle mit sql erstellen
 
Zitat:

Zitat von fl63 (Beitrag 1110838)
Neue Datensätze (aus Open Office), werden bereits zwischen die alten Datensätze geschrieben.
zB. werden zwischen den 200sten und dem 201sten Datensatz zwei Neue eingefügt,was bei 1000 und mehr Datensätzen nicht zu erkennen ist.

Dann würde ich das System nochmal überdenken oder einen eindeutigen Index einführen. Und einer DB ist das auch ganz egal, wo der Datensatz steht, die Tabelle kann nämlich vorsortiert ausgegeben werden. Spätestens wenn du einen Datensatz löschst und das DB-System den Speicher nicht sofort freigibt und die Tabelle optimiert, dann kann ein neuer Datensatz (auch mit neuem Index) irgendwo mittendrin erstellt werden.

Bernhard

fl63 8. Jul 2011 16:50

AW: Tabelle mit sql erstellen
 
@ rollstuhlfahrer

Um Sinngemäße Überschneidungen der Datensätze zu vermeiden, wird bereits in Open Office vorsortiert.

rollstuhlfahrer 8. Jul 2011 19:58

AW: Tabelle mit sql erstellen
 
Gut, andere Frage: Warum löschst du gleich die ganze Tabelle? - Reicht es dir nicht, diese zu leeren?

Bernhard

fl63 8. Jul 2011 20:06

AW: Tabelle mit sql erstellen
 
Auch eine Möglichkeit. Dann müßte ich die neuen Daten nur wieder neu einlesen. Würde das leeren der Tabelle nicht vielleicht mehr Zeit in Anspruch nehmen, wie das Erstellen einer neuen Tabelle??

rollstuhlfahrer 9. Jul 2011 10:48

AW: Tabelle mit sql erstellen
 
Wie viele Datensätze hast du? Muss das Programm wirklich Optimierungen im Millisekundenbereich haben, wenn du schon alleine bei der Datenübertragung viel mehr Optimierungspotential hast? (1 ms * 10.000 Datensätze = 10 Sekunden schneller!!).

Bernhard

fl63 9. Jul 2011 12:18

AW: Tabelle mit sql erstellen
 
Zitat:

Zitat von rollstuhlfahrer (Beitrag 1110904)
Wie viele Datensätze hast du? Muss das Programm wirklich Optimierungen im Millisekundenbereich haben, wenn du schon alleine bei der Datenübertragung viel mehr Optimierungspotential hast? (1 ms * 10.000 Datensätze = 10 Sekunden schneller!!).

Bernhard

ca. 250.000 Datensätze.

Optimierungspotential bei Datenübertragung??

fl63

jobo 9. Jul 2011 13:33

AW: Tabelle mit sql erstellen
 
Wie schon geschrieben wurde, in einer DB kannst Du ohne große Mühe sortieren und Dubletten rauswerfen. Und der CSV Import wird direkt aus FB eingelesen vielfach schneller sein, als satzweise per Delphi. Wie lange Drop/Recreate der Tabelle läuft im Vergleich zum leeren hängt auch von der Indizierung ab.

Wenn Du gerne etwas mit Delphi machen möchtest, dann programmier doch ein Eingabeformular für die Daten mit ein wenig Such und Sortierkomfort, damit sie direkt in FB landen und spar Dir die Pflege in OO.

fl63 9. Jul 2011 19:25

AW: Tabelle mit sql erstellen
 
Zitat:

Zitat von jobo (Beitrag 1110916)
Und der CSV Import wird direkt aus FB eingelesen vielfach schneller sein, als satzweise per Delphi.

:-DUnd wie geht das???

FredlFesl 10. Jul 2011 12:34

AW: Tabelle mit sql erstellen
 
Wer suchtet der findet.

fl63 10. Jul 2011 13:28

AW: Tabelle mit sql erstellen
 
Ich selbst habe mittlerweile Load Data infile gefunden, leider englischsprachig.
Kann mir mal bitte jemand diesen Befehl "verdeutschen"?

mkinzler 10. Jul 2011 13:32

AW: Tabelle mit sql erstellen
 
Eine Funktion von MySQL wird dir bei Firebird wenig helfen.
Zitat:

Und der CSV Import wird direkt aus FB eingelesen vielfach schneller sein, als satzweise per Delphi.
Noch schneller wäre es denn falschen Ansatz zu korrigieren.

fl63 10. Jul 2011 14:39

AW: Tabelle mit sql erstellen
 
Zitat:

Zitat von mkinzler (Beitrag 1111006)
Eine Funktion von MySQL wird dir bei Firebird wenig helfen.

Danke! Das ist schon recht hilfreich. Dann brauche ich mich ja in diese Richtung nicht weiter zu informieren.

Zitat:

Zitat von jobo (Beitrag 1110916)
Und der CSV Import wird direkt aus FB eingelesen vielfach schneller sein, als satzweise per Delphi.

Dann ist wohl nu dieses hier?
Zitat:

Zitat von FredlFesl (Beitrag 1111001)
Wer suchtet der findet.

die einzigste Möglichkeit. Oder?

fl63

mkinzler 10. Jul 2011 14:42

AW: Tabelle mit sql erstellen
 
Nein, aber andere wurden dir ja auch gennannt, aber anscheinend hast du wenig Lust, dich mit der materie zu befassen!

fl63 15. Jul 2011 12:00

AW: Tabelle mit sql erstellen
 
Mittlerweile habe ich mich mit external Tabellen beschäftigt.
Allerdings macht die Compilierung Schwierigkeiten. Ich bekomme immer die Fehlermeldungen:

nicht genügend wirkliche Parameter (an der Stelle ... := 'Create table extern..)
inkompatible Typen Integer und String (an der Stelle ...external File 'c: ...)
Operator oder Semikolon fehlt (an der Stelle ...2006.txt'...)
und eine Reihe weiterer Meldungen.

die selben Meldungen für die darauffolgende Zeile

Delphi-Quellcode:
procedure TForm1.createtableClick(Sender: TObject);
begin
//--------erstellt tabelle---
zquery1.SQL.Text := 'create table Tabelle (  feld001  varchar(50), feld002  varchar(200) )' ;
zquery1.Execsql;
end;


procedure TForm1.Dat1einlesenClick(Sender: TObject);
begin
zquery1.SQL.Add := 'CREATE TABLE externe EXTERNAL File 'c:\Daten\2006.txt'(field1 varchar(50), field2 varchar(150))'; //Fehlermeldungen in dieser Zeile
zquery1.SQL.Add := 'INSERT INTO Tabelle (field1, field2) SELECT field1, field2 FROM ext1';  // Fehlermeldungen in dieser Zeile

zquery1.ExecSQL;
end;
Ich habe die Möglichkeiten
zquery1.SQL.Add... sowie SQL.Text ausprobiert aber in Beiden Fällen Fehlermeldungen

kann mir dabei bitte jemand helfen?

fl63

p80286 15. Jul 2011 12:19

AW: Tabelle mit sql erstellen
 
Dir fehlen wohl wirklich einige Grundlagen?
Delphi-Quellcode:
Q.SQL.Text:=' select * from Tabelle';
oder
Delphi-Quellcode:
Q.SQL.Clear;
Q.SQL.Add(' select * from Tabelle');
Gruß
K-H

Edith:
Delphi-Quellcode:
.Add := '...'
sieht irgendwie wie BASIC aus !!!

fl63 15. Jul 2011 12:45

AW: Tabelle mit sql erstellen
 
Danke jetzt kompiliert es

Dennoch folgende Fehlermeldung bei Ausführung:

Incorrect token followed by ":"

Delphi-Quellcode:
procedure TForm1.Dat1einlesenClick(Sender: TObject);
begin
zquery1.SQL.Clear;
zquery1.SQL.Add ('CREATE TABLE externe EXTERNAL File c:\Daten\2006.txt(field1 vachar(50)), field2 varchar(150)');
zquery1.SQL.Add ('INSERT INTO Tabelle (field1, field2) SELECT field1, field2 FROM ext1');

zquery1.ExecSQL;
end;
Ich tippe mal es bezieht sich auf C:\
Aber wie ändern? Das Verzeichnis in Hochkommas setzen ? Aber dann kompiliert nichts mehr.

p80286 15. Jul 2011 13:15

AW: Tabelle mit sql erstellen
 
Benutze " , falls Deine DB damit umgehen kann, oder eben ''.
Aber "Tippen" ist nicht so der richtige Weg um Fehler zu finden;
Ich zumindestens vermisse das ; ,das doch eigentlich auf das "invalid Token " folgen soll.

Gruß
K-H

Delphi-Quellcode:
zquery1.SQL.Add ('CREATE TABLE externe EXTERNAL File ''c:\Daten\2006.txt''(field1 vachar(50)), field2 varchar(150)');


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:28 Uhr.

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