Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Komplette Tabelle aus ner db in die andere kopieren (https://www.delphipraxis.net/53303-komplette-tabelle-aus-ner-db-die-andere-kopieren.html)

mojo777 13. Sep 2005 20:48

Datenbank: interbase6 • Version: 6 • Zugriff über: normale delphi6 komponenten...

Komplette Tabelle aus ner db in die andere kopieren
 
Hallo liebe Gemeinde!
Hab mich heute gefragt obs möglich ist eine kopmlette tabelle aus einer datenbak (ib6) in die andere (auch ib6) zu kopieren.
eine ist remote, die andere lokal.
ok.. mölgich ist es. habs auch shcon oft geschafft.. aber mit schleifen... das ist doof und nicht universell.
kennst wer vll eine schnelle und elegante möglichkeit eine art "datapump" zu erzeugen?

vielen DANK!

gruß

mojo

marabu 14. Sep 2005 07:46

Re: Komplette Tabelle aus ner db in die andere kopieren
 
Hallo mojo,

wenn du das professionell machst, dann solltest du über Replikation nachdenken. Ansonsten ist die BDE recht hilfreich, da sie folgendes ermöglicht:

SQL-Code:
INSERT INTO :db1:table SELECT * FROM :db2:table
Es existieren noch mehr oder weniger elegante Alternativen, aber da müsste man deine Anforderungen kennen - und verstehen.

Grüße vom marabu

mojo777 15. Sep 2005 18:43

Re: Komplette Tabelle aus ner db in die andere kopieren
 
hi, hmm... kann mir irgendwie nicht so wirklich vorstellen, wie das funktionieren soll....
denn wenn ich eine sql-anfrage ausführen lasse, dann ist diese doch immer auf eine datenbank bezogen...
und in welcher form gebe ich db1 und db2 an?
127.0.0.1:c:\db\file1.gdb und
127.0.0.1:c:\db\file2.gdb??

da sind aber doch noch die benutzerrechte etc... *verwirrt*....
kannst du mir vll einen link oder sogar eine buchepfehlung geben, welches das thema anreißt?

vielen dank!

mfg

mojo777 15. Sep 2005 20:58

Re: Komplette Tabelle aus ner db in die andere kopieren
 
ok.... hier meine lösung.. mehr oder weniger per hand.
Delphi-Quellcode:
implementation
procedure TfmMain.replicateTable(quelle,ziel:String);
var i, j:integer;
inpFelder, outpFelder, sql, werte:String;
begin
dmData.repl_global.sql.clear;
dmData.repl_global.sql.add('SELECT * FROM '+quelle);
try
  dmData.repl_global.open;
  dmData.repl_global.FetchAll;
  dmData.repl_global.first;
  dmData.repl_local.sql.clear;
  dmData.repl_local.sql.add('DELETE FROM '+ziel);
  dmData.repl_local.ExecSQL;
  inpFelder:=dmData.repl_global.Fields[0].DisplayName;
  for i:=1 to dmData.repl_global.FieldCount-1 do  //feldnamen vorbereiten
    begin
    inpFelder:=inpFelder+', '+(dmData.repl_global.Fields[i].DisplayName);
    end;
  for i:=1 to dmData.repl_global.RecordCount do   //kopieren
      begin
      werte:=dmData.repl_global.fields[0].AsString;
        for j:=1 to dmData.repl_global.FieldCount-1 do
          begin
          if dmData.repl_global.fields[j].AsString='' then
          werte:=werte+', null'
          else werte:=werte+', '''+trim(dmData.repl_global.fields[j].AsString)+'''';
          end;
        dmData.repl_local.SQL.Clear;
        dmData.repl_local.sql.add('INSERT INTO '+ziel+' ('+inpFelder+') '+
        ' VALUES ('+werte+')');
        try dmData.repl_local.ExecSQL; except
                errlog.lines.add(dmData.repl_local.sql.text);
                errlog.lines.add(werte);
                end;
        dmData.repl_global.Next;
    end;
except end;


end;
gruß

marabu 16. Sep 2005 07:20

Re: Komplette Tabelle aus ner db in die andere kopieren
 
Hallo mojo,

Zitat:

Zitat von mojo777
habs auch schon oft geschafft.. aber mit schleifen... das ist doof und nicht universell.

die von dir vorgestellte Lösung ist NICHT doof. Leider kann IB nicht mehrere Datenbanken in einem statement ansprechen. Als Grund wird seine "multi generational architecture" angegeben.

Die von mir erwähnte Lösung auf Basis der BDE wollte ich soeben implementieren - und bin gescheitert. Ich hätte besser LOCALSQL anstelle BDE schreiben sollen, denn die spezielle Tabellenreferenz für einen heterogenen Join wird nur für die lokalen Datenbanken umgesetzt.

Bei Gelegenheit werde ich prüfen, ob das Kopieren mit Hilfe einer in memory table Vorteile bringt.

Freundliche Grüße
marabu

mojo777 16. Sep 2005 15:01

Re: Komplette Tabelle aus ner db in die andere kopieren
 
hmm. ok. dann werde ich mich vorerst mit meiner schleife begnügen müssen. danke für die antworten!
das was mir dabei sorgen bereitet ist, das programm, aus welchem der ausschnitt hier zu sehen ist wird auf einem leistungsschwachen prozessor laufen und da befürchte ich, dass wenn dann über 5000 datensätze gibt, das system in die knie geht.
:-(
auf welcher basis funtioniert eigenltich sql von interbase? ;-)
weiss wer in welcher sprache es geschrieben ist? :-)


mfg

mojo

shmia 16. Sep 2005 16:09

Re: Komplette Tabelle aus ner db in die andere kopieren
 
Schau dir mal die Interbase DataPump v 3.4 an.
http://www.clevercomponents.com/downloads/index.asp
siehe auch:
http://www.ibphoenix.com/main.nfs?a=...=ibp_mig_tools

marabu 16. Sep 2005 16:58

Re: Komplette Tabelle aus ner db in die andere kopieren
 
Mojo, soweit ich das verstehe hast du Benutzer- und Betriebsfunktionen im gleichen Programm. Kannst du den Betriebsanteil (Tabelle kopieren) nicht in einen eigenen Prozess auslagern? Eventuell kannst du die Tabelle auf der anderen Seite aus der Backup-Datei erzeugen, die du nachts erstellst (gbak -O, restore table by table). Interbase wurde übrigens in C implementiert. Was du mit Basis von SQL meinst, verstehe ich leider nicht.

Und vergiss die Replikation nicht (z.B. IB Replicator).

marabu


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