AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi DB-übergreifende Abfrage / Kopie einer Tabelle
Thema durchsuchen
Ansicht
Themen-Optionen

DB-übergreifende Abfrage / Kopie einer Tabelle

Ein Thema von nostromo73 · begonnen am 24. Mär 2003 · letzter Beitrag vom 31. Mär 2003
Antwort Antwort
Seite 1 von 2  1 2      
nostromo73

Registriert seit: 24. Mär 2003
11 Beiträge
 
Delphi 7 Professional
 
#1

DB-übergreifende Abfrage / Kopie einer Tabelle

  Alt 24. Mär 2003, 22:35
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
  Mit Zitat antworten Zitat
nostromo73

Registriert seit: 24. Mär 2003
11 Beiträge
 
Delphi 7 Professional
 
#2
  Alt 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....
  Mit Zitat antworten Zitat
Benutzerbild von X-Dragon
X-Dragon

Registriert seit: 14. Jan 2003
Ort: Schortens
289 Beiträge
 
Delphi 6 Enterprise
 
#3
  Alt 26. Mär 2003, 17:13
Willst du nur eine exakte Kopie haben?
  Mit Zitat antworten Zitat
Benutzerbild von APP
APP

Registriert seit: 24. Feb 2003
Ort: Graz (A)
705 Beiträge
 
Delphi 7 Enterprise
 
#4
  Alt 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.

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
Armin P. Pressler

BEGIN
...real programmers are using C/C++ - smart developers Delphi;
END;
  Mit Zitat antworten Zitat
nostromo73

Registriert seit: 24. Mär 2003
11 Beiträge
 
Delphi 7 Professional
 
#5
  Alt 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 ?
  Mit Zitat antworten Zitat
Nexio

Registriert seit: 24. Mär 2003
Ort: Mainz
13 Beiträge
 
Delphi 5 Enterprise
 
#6
  Alt 27. Mär 2003, 12:34
Hi !

Ich habe so ähnliches Problem!
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>=-…
  Mit Zitat antworten Zitat
nostromo73

Registriert seit: 24. Mär 2003
11 Beiträge
 
Delphi 7 Professional
 
#7
  Alt 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]
  Mit Zitat antworten Zitat
Gast
(Gast)

n/a Beiträge
 
#8
  Alt 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 ...und Du wirst sehen wie leicht das Ganze ist...


Gruß

Paul Jr.
  Mit Zitat antworten Zitat
Benutzerbild von APP
APP

Registriert seit: 24. Feb 2003
Ort: Graz (A)
705 Beiträge
 
Delphi 7 Enterprise
 
#9
  Alt 27. Mär 2003, 19:16
@nostromo73

so ganz kann ich das nicht "Unterschreiben":
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 "BDEMOS:customer.db" C, ":BCDEMOSrders.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
Armin P. Pressler

BEGIN
...real programmers are using C/C++ - smart developers Delphi;
END;
  Mit Zitat antworten Zitat
Gast
(Gast)

n/a Beiträge
 
#10
  Alt 27. Mär 2003, 20:23
Hallo Nostromo 8)

Also... ich habe mich natürlich heute von meinen Vorgänger irgendwie beeinflussen lassen... (von wegen NICHT MÖGLICH??? ) und da musste ich schmunzeln... 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 ..., 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...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 09:51 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