Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi TADODataSet.LoadFromFile in DB schreiben (https://www.delphipraxis.net/160398-tadodataset-loadfromfile-db-schreiben.html)

PistolenPeter 11. Mai 2011 12:03

Datenbank: Oracle • Version: 10g • Zugriff über: TADODataSet

TADODataSet.LoadFromFile in DB schreiben
 
Hallo zusammen,

ich möchte Daten aus einer XML Datei laden und zurück in eine Datenbank schreiben.
Die XML Datei habe ich zuvor mit TADODataSet.SaveToFile erzeugt.
So sieht mein zurzeit Code aus:

Delphi-Quellcode:
  DataSetSource.LoadFromFile(FileName);

  CreateTable(DataSetSource); // eigene Methode erstellt leere Tabelle je nach Zieldatenbank
  DataSetDest.CommandText := 'SELECT * FROM FileName WHERE 1=0';
  DataSetDest.Open;

  while NOT DataSetSource.Eof do
  begin
    DataSetDest.Insert;

    for n := 0 to DataSetSource.Fields.Count - 1 do
    if NOT DataSetSource.Fields[n].IsNull then
      DataSetDest.Fields[n].Value := DataSetSource.Fields[n].Value;
    DataSetDest.Post;

    DataSetSource.Next;
  end;
end;
Das ist allerdings sehr langsam.
Ich habe schon probiert das "DataSetDest.Post" erst nach dem gesamten Durchlauf auszuführen, aber das hat auch keinen merklichen Unterschied gemacht.

Hat jemand einen Idee, wie man das Ganze etwas schneller hinbekommt?
Es müsste doch eine Möglichkeit geben über das Recordset Daten zu kopieren, oder nicht?
Alle Versuche in diese Richtung sind allerdings kläglich gescheitert.

Grüße
Peter

DeddyH 11. Mai 2011 12:06

AW: TADODataSet.LoadFromFile in DB schreiben
 
Hallo und Willkommen in der DP :dp:,

kannst Du nicht einfach die INSERT INTO SELECT FROM-Syntax benutzen? Ich bin nicht sicher, kann mir aber vorstellen, dass das schneller geht.

PistolenPeter 11. Mai 2011 12:44

AW: TADODataSet.LoadFromFile in DB schreiben
 
Hallo Detlef,

Danke für Deine schnelle Antwort.
Nach dem Einladen der XML Datei über LoadFromFile kann ich über die ADODataSet Komponente auf die Daten zugreifen.
Die SQL Anweisung, wie von Dir vorgeschlagen, verlangt aber doch im "SELECT FROM" Teil eine existierende Tabelle in der aktuellen Datenbank, oder nicht?
Ich verstehe nicht, wie ich dort als Quelle ein DataSet angeben soll.

Grüße
Peter

DeddyH 11. Mai 2011 12:59

AW: TADODataSet.LoadFromFile in DB schreiben
 
Sry, Du hast recht, ich hatte Dich falsch verstanden. Dann muss man sich wohl etwas anderes ausdenken :gruebel:

Jumpy 11. Mai 2011 13:07

AW: TADODataSet.LoadFromFile in DB schreiben
 
Gibts nicht irgendwelche Oracle-Tools, mit denen man solche Dateien direkt in die Datenbank blasen kann? SQLLoader, IrgendwasPump,...?

PistolenPeter 11. Mai 2011 13:38

AW: TADODataSet.LoadFromFile in DB schreiben
 
Ja, da gibt's jede Menge und teilweise sogar sehr gute Programme.
Aber ich brauche eines das
  1. als DLL in andere meiner Anwendungen integriert werden kann.
  2. Daten von unterschiedlichen Datenbanken kopiert (von Oracle zu MS SQL oder umgekehrt).
  3. quelloffen und lizenzfrei ist.
Grüße
Peter

Jumpy 11. Mai 2011 13:48

AW: TADODataSet.LoadFromFile in DB schreiben
 
Keine Ahnung ob das schneller ist, aber kann man nicht beim durchlaufen der Source nur einen riesen String erzeugen, der nachher ein "SQL-Insert Into" - Befehl wird und dann mit einem Insert alles in die Tabelle schreiben?

Das sequenzielle durchlaufen der Quelle, das ja wahrsch. das langsame ist, wird dabei natürlich leider nicht vermieden.

jobo 11. Mai 2011 14:34

AW: TADODataSet.LoadFromFile in DB schreiben
 
Die Loader Funktionen von Oracle sind ein Teil des Produkts.
Damit kannst Du eine XML Tabelle als externaltable deklarieren und importieren. Sie muss dafür allerdings zunächst auf den Server.

also
a) XML Datei auf den Server
b) external table darauf definieren
c) Zieltabelle erzeugen
d) Daten laden

PistolenPeter 11. Mai 2011 14:47

AW: TADODataSet.LoadFromFile in DB schreiben
 
Wie gesagt möchte ich aber Tabellen auch in andere Datenbanken kopieren können.
Eigentlich geht es nur darum Tabellen zu exportieren, per E-Mail zu versenden (deshalb das XML Format) und anschließend wieder zu importieren.
Quell- und Zieldatenbank dürfen dabei keine Rolle spielen, da ich auch Tabellen vom SQL Server in Oracle oder umgekehrt importieren möchte.

Dateien auf den Datenbankserver kopieren kann ich leider nicht.

Grüße
Peter

jobo 11. Mai 2011 17:13

AW: TADODataSet.LoadFromFile in DB schreiben
 
Dass es eine beliebige DB sein soll, war mir nach dem Intro usw. nicht ganz klar.

Ok, dann vielleicht per [ADODataset].recordset
Das bietet Zugriff auf die Recordset Schnittstelle.

Dort geht dann sowas (VB Beispiel), vielleicht hilft Dir das- nach Portierung- weiter:
Code:
Dim p As New PropertyBag

p.WriteProperty "Tmp", rs1
Set rs2 = p.ReadProperty("Tmp")

Presto! A genuine copy.

(einer der ersten google Treffer, gibt auch ausführlichere Beispiele, Stichwort PropertyBag ADO copy recordset)


Insert Scripte dürften auch schneller sein, als per Dataset/ per Field/ post zu arbeiten.
Wurde ja schon vorgeschlagen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:19 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