[Delphi / ADO] kopieren tussen twee databases

Pagina: 1
Acties:
  • 149 views sinds 30-01-2008
  • Reageer

  • charlie
  • Registratie: Oktober 2000
  • Laatst online: 07-03 11:08
Ik wil een query van de ene database (Intersystems Caché via ODBC) kopiëren naar een (nieuwe) tabel in een andere (MYSQL), om er opnieuw queries op los te laten...
Weet hier iemand een oplossing voor om dit op een vlotte manier te doen? In access kan je dit wel voor gekoppelde tabellen met een insert into opdracht, maar het probleem met ado componenten in Delpi is dat je hier geen insert into kan gebruiken omdat je maar 1 connectie tegelijk kan gebruiken, of kan dit wel???

Verwijderd

Uhm ... je wil een query kopiëren? Ik neem maar aan dat je een tabel bedoelt.

Het is heel goed mogelijk om twee ADO Connection objecten te maken, ieder naar een aparte database, om de gegevens via 1 connectie met een SELECT op te halen en via de andere connectie met een insert in een tabel te zetten. Echt efficient is dit niet, maar efficiente oplossingen zullen waarschijnlijk wat complexer worden.

Ik ben niet bekend met Delphi, maar als een stuk code hebt en vast komt te zitten, cut & paste het hierheen en ik of iemand andrs kunnen je vast wel verder helpen.

Succes :)

  • charlie
  • Registratie: Oktober 2000
  • Laatst online: 07-03 11:08
Ik bedoel eigenlijk dat ik de recordset gevonden dmv een query wil kopieren naar een tabel in een andere database.
Het is me wel al gelukt om deze naar een bestand weg te schrijven met de SavetoFile methode, en ze opnieuw op te laden in een andere Adodataset, maar het lukt mij niet om ze naar een tabel weg te schrijven...

Verwijderd

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
With qryInput do 
  begin
   SQL:='select veld1, veld2 from olddb';
   Open;
   First;
  end;
qryOutput.SQL:='insert into newdb (veld1, veld2) (:veld1, :veld2)';
For nLus:=0 to qryInput.RecordCount-1 do
  begin
    qryOutput.ParamsByName('veld1').AsInteger:=qryInput.FieldByName('veld1').AsInteger;
    qryOutput.ParamByName('veld2').AsString:=qryInput.FieldByName('veld2').AsString;
    qryOutput.ExecSQL;
    next;
  end;

zoiets, de sql zal wel niet helemaal kloppen, maar het idee wel..

  • charlie
  • Registratie: Oktober 2000
  • Laatst online: 07-03 11:08
ja, met een lus kom je er natuurlijk ook wel, maar ik was op zoek naar een iets universelere oplossing. Op deze manier moet je voor iedere tabel die je kopieert een nieuwe lus schrijven, en ik vrees dat de performantie ook niet optimaal zal zijn, op deze manier wordt iedere record apart gepost.


Ik dacht meer aan iets als :
code:
1
2
3
temp := Oldquery.clone;
Nieuwetabel := temp;
Nieuwetabel.post;

Waarbij temp, nieuwetabel en oldquery van het type Tadocustomdataset zijn...
Maar ik vrees dat zoiets niet zal werken :( , ik ga het in elk geval morgen toch nog eens testen. >:)

Verwijderd

Is dit wat?

[url="http://groups.google.com/groups?q=delphi+copy+table&hl=nl&lr=&ie=UTF-8&oe=UTF-8&selm=3709E2E3.9E4571B4%40siri.co.in&rnum=2"]http://groups.google.com/groups?q=delphi+copy+table&hl=nl&lr=&ie=UTF-8&oe=UTF-8&selm=3709E2E3.9E4571B4%40siri.co.in&rnum=2[/url]

Of bekijk Tkbmmemtable eens:http://www.components4developers.com

die TBatchmove doet wat je wilt volgens mij?

  • charlie
  • Registratie: Oktober 2000
  • Laatst online: 07-03 11:08
Probleem met Tbatchmove is dat het een BDE component is, en ik wil het met ADO doen, anders moet ik op alle clients de BDE-Engine installeren....
Toch bedankt ;)
[edit]
Ik heb geprobeerd met onderstaande code :
[\edit]

[code]ADOQuery1.LoadFromFile('c:\test.txt');
ADOTable1.Recordset := ADOQuery1.Recordset;
ADOTable1.UpdateBatch(arAll);[\code]

Maar dat gaf geen resultaat, hij wil geen data wegschrijven naar de tabel...
Als ik een grid open dat wijst naar adotable1 wijst, komt er wel data in, maar ik kan deze niet wegschrijven naar de gelinkte MYSQL tabel.
Ik zal toch voor de lus moeten gaan vrees ik.

??Tags werken niet??

  • charlie
  • Registratie: Oktober 2000
  • Laatst online: 07-03 11:08
Op zondag 21 juli 2002 20:40 schreef hezik het volgende:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
With qryInput do 
  begin
   SQL:='select veld1, veld2 from olddb';
   Open;
   First;
  end;
qryOutput.SQL:='insert into newdb (veld1, veld2) (:veld1, :veld2)';
For nLus:=0 to qryInput.RecordCount-1 do
  begin
    qryOutput.ParamsByName('veld1').AsInteger:=qryInput.FieldByName('veld1').AsInteger;
    qryOutput.ParamByName('veld2').AsString:=qryInput.FieldByName('veld2').AsString;
    qryOutput.ExecSQL;
    next;
  end;

zoiets, de sql zal wel niet helemaal kloppen, maar het idee wel..
Vermits ik echt niets beters kon vinden, heb ik inderdaad een lus geschreven om alle records te doorlopen. Het uiteindelijke resultaat ziet er als volgt uit :
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
procedure TFRaadplegenorder.TADOQuerykopieren(BronDB: TADOQuery; Tabelnaam: String);
var
nVeld : integer;
begin
With BronDB do
 begin
  Active := False;
  Active := True;
  //Om Query opnieuw uit te refreshen;
  First;
  While not( Eof) do
  begin
    with ADOCommand1 do
    begin
     CommandText := 'INSERT DELAYED INTO ' + Tabelnaam
     + ' VALUES (' + QuotedStr (Fields[0].AsString);
     for nVeld:=1 to FieldCount-1 do
     CommandText := CommandText + ', ' + QuotedStr(Fields[nVeld].AsString);
     CommandText := CommandText + ')';
     Execute;
    end;
   Next;
  end;
 end;
end;

Als er nog iemand voorstellen heeft voor een verdere optimalisatie hoor ik het graag.
De code is geschreven voor een doeltabel met dezelfde structuur als de resultset van de Query. Ik wou immers data uit het ene dbms exporteren naar een ander...
De doeldatabase is MYSQL.
Pagina: 1