AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Einfügen über externalTabelle funktioniert nicht richtig
Thema durchsuchen
Ansicht
Themen-Optionen

Einfügen über externalTabelle funktioniert nicht richtig

Ein Thema von blutigerAnfänger · begonnen am 27. Feb 2014 · letzter Beitrag vom 12. Sep 2014
Antwort Antwort
Perlsau
(Gast)

n/a Beiträge
 
#1

AW: Einfügen über externalTabelle funktioniert nicht richtig

  Alt 27. Feb 2014, 17:49
@Perlsau
Also in Datei Tabelle2.txt steht meine originale TestTabelle.
In Tabelle2export.txt ist die External Tabelle als Insert statement.(von IBExpert exportiert)
Ich hoffe es hilft dir weiter.
Wo in der exportierten Tabelle allerdings die Kommas herkommen wird wohl ein Geheimnis von Firebird bleiben. Ich vermute mal, daß sollen die ominösen Trennzeichen sein, welche nicht in der Original Datei vorhanden sind.
Wenn ich mir die originale Tabelle anschaue, komme ich zu dem Schluß, daß es sich um eine ganz normale Textdatei handelt. Die erste Spalte ist immer 50 Zeichen lang, die zweite geht bis zum Linebreak. Da böte es sich doch an, diese Textdatei via Stringliste einzulesen, danach durchzuiterieren und dabei die jeweils ersten 50 Zeichen jedes Items als Inhalt der Spalte 1 (Fremdwort) zu kopieren. Der Rest ist die Beschreibung des Fremdworts (ungetestet, daher ohne Garantie):
Delphi-Quellcode:
Procedure Einlesen;
Var
  MeineListe : TStringList;
  Datei,
  Fremdwort,
  Beschreibung : String;
  i,z : Integer;

Begin
  If not OpenDialog.Execute then exit;
  Datei := OpenDialog.FileName;
  MeineListe := TStringList.Create;

  Try
    MeineListe.LoadFromFile(Datei);
    z := MeineListe.Count;

    If z > 0 then
    For i := 0 to z-1 DO
    Begin
      Beschreibung := Liste[i];
      Fremdwort := Trim(Copy(Beschreibung,1,50);
      Delete(Beschreibung,1,50);

      DatenModul.Dataset.Append;
      DatenModul.Dataset.FieldByName('FREMDWORT').AsString := Fremdwort;
      DatenModul.Dataset.FieldByName('BESCHREIBUNG').AsString := Beschreibung;
      DatenModul.Dataset.Post;
    End;
  Finally
    MeineListe.Free;
  End;

  ShowMessage('Einlesen von "' + Datei + '" beendet ...');
End;
In der Original-Textdatei kommen etliche Kommas vor. Wenn die als Trennzeichen fungieren, kann das natürlich nicht klappen.

Wie hattest du denn mit IbExpert die externe Datei eingebunden?
  Mit Zitat antworten Zitat
blutigerAnfänger

Registriert seit: 23. Mär 2010
82 Beiträge
 
#2

AW: Einfügen über externalTabelle funktioniert nicht richtig

  Alt 27. Feb 2014, 18:34
Ich benutze IBExpert eigentlich nur um Ergebnisse anzusehen, die von Delphi Quelltext erzeugt wurden.

Nun eine Frage zu deinem Quelltext: Datenmodul?? Steht in den Interbasekomponenten nicht drin.

Offenbar willst du jetzt einen anderen Weg als externalFile einschlagen?
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#3

AW: Einfügen über externalTabelle funktioniert nicht richtig

  Alt 27. Feb 2014, 18:48
Nun eine Frage zu deinem Quelltext: Datenmodul?? Steht in den Interbasekomponenten nicht drin.
Ein Datenmodul ist ein Container für Datenzugriffs-Komponenten. Du kannst ein neues Datenmodul genau so anlegen, wie du z.B. eine neue Form anlegst. Ich verwende das Datenmodul aber auch für die meisten Methoden, die mit dem direkten Datenzugriff zu tun haben. Natürlich mußt du deine Datenzugriffs-Komponenten nicht in einem Datenmodul unterbringen.

Offenbar willst du jetzt einen anderen Weg als externalFile einschlagen?
Ich hab keine Ahnung, welchen Weg du gegangen bist, um den Inhalt der Textdatei in deine Firebird-Datenbank zu bekommen, doch ganz offensichtlich war diese Methode fehlerhaft. Daher habe ich dir eine ganz einfache, übersichtliche Vorgehensweise gezeigt. Ob du das übernimmst oder dir was anderes überlegst, bleibt dir überlassen.

Es geht ja offenbar nicht darum, eine externe Datei zur ständigen Verfügung zu haben, wie das z.B. beim Einbinden einer external Table beabsichtigt ist, sondern um das Einlesen von Daten aus einer Textdatei in die Datenbank. Vermutlich willst du dir ein datenbankgestütztes Fremdwörterbuch bauen und dafür bereits vorhandene Fremdwort-Ressourcen verwenden. Das heißt, du willst die Inhalte nur einmal einlesen, danach benötigst du diese Textdatei nicht mehr. Anders wäre es, wenn du das ExternalFile benötigen würdest, weil irgend eine andere Anwendung diese External Table ständig aktualisiert. Bei External Table werden, soweit ich das verstanden habe, keine Kopien der Inhalte in der Datenbank angelegt, sondern das ExternalFile direkt als Speicher verwendet. Du aber möchtest die Daten der Textdatei in deiner Datenbank-Tabelle verfügbar haben.

Übrigens fehlt in meiner Methode noch eine Prüfung, ob das aktuell einzufügende Fremdwort bereits in der Datenbank existiert.
  Mit Zitat antworten Zitat
blutigerAnfänger

Registriert seit: 23. Mär 2010
82 Beiträge
 
#4

AW: Einfügen über externalTabelle funktioniert nicht richtig

  Alt 27. Feb 2014, 19:22
Ein Datenmodul ist ein Container für Datenzugriffs-Komponenten. Du kannst ein neues Datenmodul genau so anlegen, wie du z.B. eine neue Form anlegst. Ich verwende das Datenmodul aber auch für die meisten Methoden, die mit dem direkten Datenzugriff zu tun haben. Natürlich mußt du deine Datenzugriffs-Komponenten nicht in einem Datenmodul unterbringen.
Damit werde ich mich erst einmal eine Weile beschäftigen müssen.


Es geht ja offenbar nicht darum, eine externe Datei zur ständigen Verfügung zu haben, wie das z.B. beim Einbinden einer external Table beabsichtigt ist, sondern um das Einlesen von Daten aus einer Textdatei in die Datenbank. Vermutlich willst du dir ein datenbankgestütztes Fremdwörterbuch bauen und dafür bereits vorhandene Fremdwort-Ressourcen verwenden. Das heißt, du willst die Inhalte nur einmal einlesen, danach benötigst du diese Textdatei nicht mehr. Anders wäre es, wenn du das ExternalFile benötigen würdest, weil irgend eine andere Anwendung diese External Table ständig aktualisiert. Bei External Table werden, soweit ich das verstanden habe, keine Kopien der Inhalte in der Datenbank angelegt, sondern das ExternalFile direkt als Speicher verwendet. Du aber möchtest die Daten der Textdatei in deiner Datenbank-Tabelle verfügbar haben.
Wenn ich dich richtig verstanden habe, unterliegst du offenbar einem Irrtum. Es geht nicht darum, eine externe Datei zur ständigen Verfügung zu haben, sondern um das schnelle Einlesen von Daten (vielleicht ist Bulk Insert dazu das richtige Stichwort). Im Rahmen meiner Recherche habe ich irgendwo gelesen, daß die Orignale Textdatei(mit fixer Datensatzlänge) sozusagen als Block in die ExterneFirebirdTabelle übernommen wird. Daraufhin wird diese ExterneFirebirdTabelle in eine interne Tabelle verwandelt und die externe gelöscht.
Kurz gesagt es ist ein schnellerer Datenimport als das Einlesen jedes einzelnen Datensatzes per Insert...value...
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#5

AW: Einfügen über externalTabelle funktioniert nicht richtig

  Alt 27. Feb 2014, 19:41
Es geht ja offenbar nicht darum, eine externe Datei zur ständigen Verfügung zu haben, wie das z.B. beim Einbinden einer external Table beabsichtigt ist, sondern um das Einlesen von Daten aus einer Textdatei in die Datenbank. Vermutlich willst du dir ein datenbankgestütztes Fremdwörterbuch bauen und dafür bereits vorhandene Fremdwort-Ressourcen verwenden. Das heißt, du willst die Inhalte nur einmal einlesen, danach benötigst du diese Textdatei nicht mehr. Anders wäre es, wenn du das ExternalFile benötigen würdest, weil irgend eine andere Anwendung diese External Table ständig aktualisiert. Bei External Table werden, soweit ich das verstanden habe, keine Kopien der Inhalte in der Datenbank angelegt, sondern das ExternalFile direkt als Speicher verwendet. Du aber möchtest die Daten der Textdatei in deiner Datenbank-Tabelle verfügbar haben.
Wenn ich dich richtig verstanden habe, unterliegst du offenbar einem Irrtum. Es geht nicht darum, eine externe Datei zur ständigen Verfügung zu haben, sondern um das schnelle Einlesen von Daten (vielleicht ist Bulk Insert dazu das richtige Stichwort).
Aber genau das schrieb ich oben doch! Der Grund, eine External Table einzubinden, kann nur der sein, eine externe Datei zur ständigen Verfügung zu haben. Mit deinem Hinweis im ersten Post plus der Bemerkung von mkinzler ist bei mir erstmal dieser Eindruck entstanden. Dann habe ich realisiert, daß es dir lediglich "um das Einlesen von Daten aus einer Textdatei in die Datenbank" geht.

Bulk Insert bedeutet nichts anderes, als die Daten in einem Rutsch einzulesen. Das kannst du z.B. auch mit IbExpert machen, wenn du aus den Quelldaten zuvor eine entsprechende SQL-Datei erzeugst.

MeineListe[i] := "insert into Fremdworttabelle (Fremdwort, Beschreibung) values (' + QuotedStr(Fremdwort) + ',' + QuotedStr(Beschreibung) + '); Und am Ende vor dem Freigeben der Liste:
MeineListe.SaveToFile(Datei + '.sql'); Am Ende hast du eine Textdatei, die du direkt in IbExpert via Sql-Script einlesen kannst.

Kurz: Es gibt viele Wege, um diese Daten in die Datenbank zu bekommen. Einen davon hab ich dir gezeigt.

Im Rahmen meiner Recherche habe ich irgendwo gelesen, daß die Orignale Textdatei(mit fixer Datensatzlänge) sozusagen als Block in die ExterneFirebirdTabelle übernommen wird. Daraufhin wird diese ExterneFirebirdTabelle in eine interne Tabelle verwandelt und die externe gelöscht.
Kurz gesagt es ist ein schnellerer Datenimport als das Einlesen jedes einzelnen Datensatzes per Insert...value...
Kannst du mir diese Quelle zeigen, in der beschrieben wird, wie man eine reine Textdatei ohne SQL-Befehle in die Datenbank einliest? Davon hab ich bis heute nämlich noch nie was gehört oder gelesen. Mit External Table hat das, soweit ich das beurteilen kann, aber erstmal nichts zu tun.

Könntest du vielleicht noch mitteilen, wieviele Datensätze insgesamt eingelesen werden sollen? Wenn es wirklich nur ein paar (tausend) sind, dann ist Bulk Insert quasi überdimensioniert. Meine oben gezeigte Methode würde dann vollkommen ausreichen. Bulk Insert hat zudem den Nachteil, daß du nicht ohne weiteres prüfen kannst, ob ein entsprechender Datensatz bereits existiert.
  Mit Zitat antworten Zitat
blutigerAnfänger

Registriert seit: 23. Mär 2010
82 Beiträge
 
#6

AW: Einfügen über externalTabelle funktioniert nicht richtig

  Alt 27. Feb 2014, 20:50
@Perlsau
Also ich kann dir leider keine Quelle zeigen, dennoch bin ich mir sicher ähnliches gelesen zu haben.(Altersstarrsinn??)
Ansonsten habe ich ja jetzt Material für ein paar Tage. Gute Nacht.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.667 Beiträge
 
Delphi 12 Athens
 
#7

AW: Einfügen über externalTabelle funktioniert nicht richtig

  Alt 28. Feb 2014, 07:46
Kannst du mir diese Quelle zeigen, in der beschrieben wird, wie man eine reine Textdatei ohne SQL-Befehle in die Datenbank einliest?
Firebird: http://www.firebirdfaq.org/faq209/
MySQL: http://www.little-idiot.de/mysql/mysql-121.html
Oracle: http://docs.oracle.com/cd/B10500_01/...96652/ch12.htm
Weiter habe ich jetzt nicht recherchiert. Das hat mit ständiger Verfügbarkeit usw. überhaupt nichts zu tun, sondern es geht tatsächlich um das schnelle Einlesen größerer Datenmengen aus einer externen Quelle. Auf der Zielseite braucht man natürlich SQL, aber für diesen Zweck ist es eben eine spezielle Syntax.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#8

AW: Einfügen über externalTabelle funktioniert nicht richtig

  Alt 28. Feb 2014, 08:19
Danke, DeddyH, das erweitert meinen Horizont.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:54 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