Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi DB-übergreifende Abfrage / Kopie einer Tabelle (https://www.delphipraxis.net/3675-db-uebergreifende-abfrage-kopie-einer-tabelle.html)

nostromo73 24. Mär 2003 22:35


DB-übergreifende Abfrage / Kopie einer Tabelle
 
Ich möchte über ein TADOQuery-Objekt eine INSERT-Abfrage absetzen, die das Ergebnis einer Abfrage in Datenbank A in eine Tabelle in Datenbank B schreibt.
Also in etwa so:
INSERT INTO Zieltabelle (Field1, Field2,...) SELECT FieldA, FieldB... FROM Quelltabelle1, Quelltabelle2;

Wie kann ich nun mit einem TADOQuery-Objekt auf zwei (oder mehr) DB zugreifen. Oder muss ich das anders angehen ?

Eine Lösung könnte in meinem Fall auch so aussehen, dass ich zunächst die benötigten Quelltabellen aus DB A in DB B kopiere, um gleichzeitig den Datenbestand zu sichern. Wie lässt sich so ein Kopiervorgang realisieren ?
Tobias

nostromo73 25. Mär 2003 11:09

Zur Ergänzung:
Bei den Datenbanken A und B handelt es sich um Access-Datenbanken. Der Zugriff erfolgt - wie schon erwähnt - über ADO).

Bei BDE gibt es TBatchMove, um Daten zwischen zwei Table-Objekten auszutauschen. Hat ADO auch etwas Ähnliches zu bieten ? Damit könnte ich dann zunächst eine Kopie der Quelltabelle (Datenbank A) in der Datenbank B anlegen. Nicht schön, aber selten....

X-Dragon 26. Mär 2003 17:13

Willst du nur eine exakte Kopie haben?

APP 26. Mär 2003 18:47

Hallo,
ist bei mir zwar schon lange her, aber die Lösung sind heterogene Joins (Verknüpfung versch. Tabellen):

Code:
1. INSERT INTO "customer.db"
2. (custno, company)
3. SELECT a.custno, b.company
4. FROM oldcustomer a, oldcustomer1 b
5. WHERE a.custno = b.custno
1. Ziel-DB
2. Felder die eingefügt werden sollen
3. 'Schnittstelle' zu 2. von den Quell-DBs (a... Tab1, b.. Tab2)
4. Quell-DBs
5. Bedingung(en)

Das sollte mit einem TADOQuery auch funktionieren. :mrgreen:

Tip: Probiere deine Statements im Datenbankexplorer aus, bevor Du sie codierst.
Tip2: Versuche zuerst nur die Zeilen 3-5 an Deine Bedürfnisse anzupassen, d.h. führe nur diese Statements im Datenbankexplorer aus um zu sehen ob alles funktioniert.
Später kannst Du noch immer das INSERT INTO einbauen...


p.s Weiter Hilfe zu SQL findest du in Deinem Delphi (bei mir D5)-Verzeichnis unter Delphi5\Help\del5xtra.hlp

nostromo73 26. Mär 2003 19:03

@X-Dragon:
Ja, eine exakte Kopie der Tabelle reicht. Hauptsache, ich habe die Quelltabellen aus Datenbank A in die Datenbank B übertragen. Alle weiteren DB-Operationen kann ich dann über eine ADOConnection mit der Zieldatenbank B steuern, da dort dann alle für die Abfrage nötigen Tabellen vorliegen.

@APP:
Das von Dir vorgeschlagene SELECT-Statement kann ich AFAIK nur an eine Datenbank absetzen, die Quell- und die Zieltabelle liegen aber in zwei unterschiedlichen Access-Datenbanken, deren Tabellen sich leider nicht so einfach über die db-Files ansprechen lassen wie bei Paradox-DBs. Oder ?

Nexio 27. Mär 2003 12:34

Hi !

Ich habe so ähnliches Problem! :cry:
Und sofern ich weiß muss du Zwei Querys benutzen da jedes von denen nur eine direkte Verbindung hat und wenn du die Verbindung änderst geht ResulSet verloren (die Daten in Query)!
Drum musst Du erst die Daten von Query1 speichern und sie der Zweiter Query2 übergeben damit es ein INSERT oder UPADE auf die Datenbank machen kann!

Du schriebst ja zwei Datenbanken NICHT Tabellen oder!
Bei Nur Tabellen ist es anders. :!:

Gruß ……-=<Nexio>=-…

nostromo73 27. Mär 2003 13:42

Zitat:

Drum musst Du erst die Daten von Query1 speichern und sie der Zweiter Query2 übergeben damit es ein INSERT oder UPADE auf die Datenbank machen kann!
Aber wie kann ich das Ergebnis der Query sinnvoll speichern ? Array, Cursor oder so was ? Oder kann ich die Query direkt als DataSource für die zweite Query verwenden ?

Zitat:

Du schriebst ja zwei Datenbanken NICHT Tabellen oder!
Bei Nur Tabellen ist es anders.
Ja, es geht um zwei Access-Datanbanken, also zwei verschiedene mdb-Files. Wenn es nur zwei Tabellen in einer DB wären, hätte ich keinerlei Probleme damit.

[edit=Daniel B]BB-Code wieder eingeschaltet, damit die Tags funktionieren. MfG Daniel B.[/edit]

Gast 27. Mär 2003 14:42

Hallo Nostromo73 8)

Es gibt’s verschiedene Wege Dein Problem zu lösen... Allerdings von Benutzung dynamischer Strukturen wie z.B. Dyn. ARRAY oder TListen würde ich Dir an dieser Stelle abraten

Ein davon wäre z.B. die Benutzung von Fremd-Komponenten wie z.B. TMemoryTable von Rx-Komponenten. Diese habe ich mal erfolgreich mit Delphi 5 für ähnliches Problem benutzt. Hier kannst Du Deine Daten unabhängig von aktuellen Session zwischenspeichern.

Eine andere Methode (die ich auch schon erfolgreich eingesetzt habe... allerdings nicht für dieses Zweck) wäre aus der Kompleten Quelle-Tabelle ein „INSERT INTO“ – Script zu erzeugen und dann in der anderen Datenbank auszuführen. Ich habe mal ein DB-Tools geschrieben die unter anderem aus jeder beliebiger (unbekannter) Tabelle dynamisch so ein SQL-Script erzeugen kann...Allerdings für Dich wäre das ein zu großer Aufwand um so was zu bewältigen.

Also sehe Dich nach entsprechenden Fremd-Komponenten um :roll: ...und Du wirst sehen wie leicht das Ganze ist... :idea:


Gruß

Paul Jr.

APP 27. Mär 2003 19:16

@nostromo73

so ganz kann ich das nicht "Unterschreiben": :coder:
Zitat:

Das von Dir vorgeschlagene SELECT-Statement kann ich AFAIK nur an eine Datenbank absetzen, die Quell- und die Zieltabelle liegen aber in zwei unterschiedlichen Access-Datenbanken, deren Tabellen sich leider nicht so einfach über die db-Files ansprechen lassen wie bei Paradox-DBs. Oder ?
Access-Datenbanken sind für den User als ein *.mdb File sichtbar, in dem sich die Tabellen befinden, Paradox-Datanbanken z.B legen für jede Tabelle ein File an (und Index-Dateien und anderes...).

Gestern benutzte ich für mein Beispiel den Datenbankexplorer und den Alias "DBDEMOS", der wenn Du nachschaust, verschiedene Tabellen vom Typ *.dbf und *.db beinhaltet.

Hier ein Auszug aus der LokalSQL-Hilfe:
Zitat:

Verbindet zwei Tabellen aus verschiedenen Datenbanken.
SELECT column_list
FROM ":database_reference:table_reference", ":database_reference:table_reference" [,":database_reference:table_reference"...]
WHERE predicate [AND predicate...]

Beschreibung

Verwenden Sie eine heterogene Verbindung zum Verbinden zweier Tabellen, die verschiedenen Datenbanken angehören. Die verbundenen Tabellen können unterschiedliche Typen haben (wie von dBASE nach Paradox oder von Paradox nach InterBase), doch können Sie nur Tabellen verbinden, deren Datenbanktypen über die BDE zugänglich sind (lokal, ODBC oder SQL Links). Bei einer heterogenen Verbindung kann es sich um jede der von Local SQL unterstützten Verbindungen handeln. Der Unterschied besteht in der Syntax für die Tabellenreferenz: Die Datenbank einer jeden Tabelle wird in der Tabellenreferenz angegeben, eingeschlossen in Doppelpunkten und die gesamte Referenz in Anführungszeichen gesetzt. Die als Teil der Tabellenreferenz angegebene Datenbank kann eine Referenz aus Laufwerk und Verzeichnis sein (für lokale Tabellen) oder ein BDE-Alias.

SELECT *
FROM ":DBDEMOS:customer.db" C, ":BCDEMOS:orders.db" O
WHERE (C.custno = O.custno)


Mein Beispiel funktioniert also für "verschiedene Datenbanken", ob allerdings TADOQuery dies auch unterstützt weiß ich nicht, da ich damit nicht arbeite, einfach ausprobieren :mrgreen:

Gast 27. Mär 2003 20:23

Hallo Nostromo 8)

Also... ich habe mich natürlich heute von meinen Vorgänger irgendwie beeinflussen lassen... :shock: (von wegen NICHT MÖGLICH??? ) und da musste ich schmunzeln... :roteyes: wie blöd ich manchmal bin...

Ich habe doch vorher davon gesprochen... dass ich DB-Tools geschrieben habe... und da musste ich plötzlich (heute Abend) feststellen, dass diese Tools verwende ich AUCH um verschiedene Datenbanken GLEICHZEITIG anzuzapfen... um die Daten zu konvertieren (von Datenbank zu Datenbank)... und zwar für alle mögliche wie z.B. ORACLE/ SQL-Server/ INTERBASE / MySQL/ACCESS und was man noch so will...Allerdings benutze ich dazu als Zwischenstufe BDE...und zwei TDataBase Komponenten...

Es ist einfach und sauber... Du stellst via TDataBase getrennte Verbindungen zu jeweiliger Datenbank... und per entsprechende TDatasets (also TQuery oder TTable oder andere...) die an den besagten getrennten TDataBase „hängen“ öffnest Du zuerst die entsprechenden SQL-Tabellen (am besten Query als Quelle und TTable als Ziel)... dann läuftst Du die Quelle seqeuntiel durch und kopierst Du Datensatz für Datensatz in die ZIEL-Datenbank...


Es ist wirklich sehr einfach... und SORRY für meine vorherige Klugsch..ßereien :warn: ..., aber das kommt davon, dass ich immer sehr wenig Zeit habe...


Gruß

Paul Jr.

P.S.

Übrigens... dies funktioniert für ALLE DataSet Komopnenten also auch für ADO und Zeus... etc...


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:15 Uhr.
Seite 1 von 2  1 2      

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