Newsgroup: it.comp.lang.delphi
Titolo: copia di tabelle

Aiuto!!!!!
devo farvi una domanda che è già stata posta
ma io proprio non riesco a risolvere il problema
devo copiare tutti i dati in una tabella di un database da una su un'altro
database
ci sono tanti modi per farlo
però io non riesco a trovare il migliore
cioè
CI METTE UN SACCACCIO DI TEMPO!!!!!!
allora ho creato le 2 connessioni
ho provato a prendere i dati della prima tabella tramite una query
in modo da ridurre già,  ma purtroppo mi servono molti campi
poi ho creato una query di inserimento nella seconda tabella passandogli
tutti quei parametri (aiuto!!!!)
ho provato a seguire il consiglio di Morde nel messaggio del 9/6/2004
ma non ho mai utilizzato un adocommand e naturalmente mi da errore
devo studiare meglio la cosa
però se qualkuno può darmi una dritta subito...
sono disperata!!!
p.s. se ho detto un sacco di assurdita scutemi :(

Puoi copiare anche un campo per volta o 10 per ogni query
Puoi anche non usare Ado command
Se apri le due tabelle :
ADOQuery.Open;
AltraTable.Open;
While Not AltraTable.Eof Do
  Begin
    ADOQuery.Append;
     AdoQuery.FieldByNam('MioCampo').AsString :=
     AltraTable.FieldByName('MioCampo').AsString ;
     ADOQuery.Next;
     AltraTable.Next;
  End ;
Attenzione a AsString che può essere AsInteger ecc.
Ed infine io aprirei due tabelle e non utilizzerei le query in questo caso.
Il codice l'ho scritto al volo e può avere errori se li trovi fatti sentire.
Ciao
In bocca al lupo.
Mario
mari...@inwind.it
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

finalmente un'anima pia che mi risponde : )
grazie ho un pň modificato il mio codice in base al tuo esempio
alla fine mi č uscita sta cosa
ti mostro il codice
     ADOQuery3.SQL.Add('select TOP 5000
campo1,campo2,campo3,campo4,campo5,campo6,campo7,campo8,campo9, from
tabella');
     ADOQuery3.Open;
     ADOTable1.Open;
     for y := 0 to ADOQuery3.RecordCount do
     Begin
       ADOTable1.Append;
       for i :=0  to ADOTable1.FieldCount-1 do
       begin
         ADOTable1.Fields[i].Value := ADOQuery3.Fields[i].Value ;
       end;
       ADOTable1.Next;
       ADOQuery3.Next;
     End ;
     (lo so che i campi son tanti ma mi servono)
     per questi <<5000>> record ci mette 35 secondi  :(
     il miglior tempo che son riuscita ad ottenere
     č normale ciň?
     o il mio codice fa cosě skifo che fa rallentare tutto?
 grazie ankora!!!!!!!



    grazie ankora!!!!!
Senti mandami in email queste due tabelle, non riesco a crederci che non ci
sia codice piu' veloce.
Io faccio una cosa simile sulla tabella dei comuni italiani (piu' di 8000
record) e me la cavo sempre in una manciata di secondi.
Ciao
-- 
Morde. (
mo...@despammed.com
)
M-List di icld: 
http://it.groups.yahoo.com/group/icld/
Firefox, il miglior browser: 
http://www.gxware.org/mozilla/


Non ha alcun senso aprire un dataset per fare il solo inserimento in
una tabella. Perché devo creare dei cursori, che sono più lenti per
natura e perché devo fare un next su di essa? (al limite un post).
Una soluzione veloce è quella di fare una *sola* query
AdoQuery3.sql.add(insert into tabella2 select  TOP 5000
campo1,campo2,campo3,campo4,campo5,campo6,campo7,campo8,campo9, from
tabella');
AdoQuery3.execsql;
-- 
"La velocità luce non è sufficiente Comandante Nunziatella, 
dobbiamo passare alla velocità smodata!"

 AdoQuery3.execsql;
AdoCommand1.CommandText := 'insert into tabella2 (select * from tabella1)';
AdoCommand1.Execute;
no? (ovviamente la sintassi può variare da un rdbms all'altro...)
--
Jax
====
Gli studiosi sono di rado bella gente e in molti casi il loro aspetto è
tale da scoraggiare l'amore allo studio nei giovani. (Henry Louis
Mencken)

AdoQuery3.execsql;
esattamente ... in questo modo eviti che i dati passino
per:
una query che di suo č lentissima in quanto deve
espandere il file di appoggio .ldb (cache) che access
crea ogni volta che ci si connette e se l'HD non č una
scheggia ci mette un bel pň su 5000 record;
una tabella la cui apertura come diceva Massimo Pini
richiede tempo per il caricamento e la verifica degli
indici;
un ciclo di (#Record X #Campi) ripetizioni in cui ogni
volta deve fare verifiche di variant per l'assegnazione
del valore fra campi.
Con la query di inserimento mediante selezione fai fare
tutto direttamente al DB ... che desideri di piů.
In piů dall'help di Delphi trovo questo:
----------------------------------------------------------------
To speed performance, an application should ordinarily
prepare the query by setting the Prepared property to
True before calling ExecSQL for the first time.
----------------------------------------------------------------
ed ancora per verificare che tutti gli inserimenti
siano andati a buon fine ...
----------------------------------------------------------------
ExecSQL returns an integer value reflecting the number
of rows affected by the executed SQL statement.
----------------------------------------------------------------
In alternativa se non ti piace la query puoi usare il
metodo Execute della AdoConnection o un AdoCommand,
vediteli direttamente dall'Help di Delphi.
Ciao MassimoB
 
---------------------------
http:\\
www.massimobeschi.it

no? (ovviamente la sintassi può variare da un rdbms all'altro...)
Anche. TADOCommand non ritorna un dataset, TADOQuery può farlo.
Poi diventa più che altro una questione di abitudine.
La cosa veramente importante è quella di non usare un live dataset
quanto non serve ;-)


 In più dall'help di Delphi trovo questo:


diversi ?
hai ragione ... scusate ingannato dal post di Massimo
Pini avevo perso il filo del Thread ... mio errore :(
no non è possibile, almeno da quello che so, eseguire
una chiamata sql che utilizzi due DB access ...


ehm... in effetti è proprio quello il problema le due tabelle si trovano su
batabase differenti  : (
cmq accetto ankora consigli  : )


Giusta osservazione, come sempre si legge troppo in fretta senza
ragionare ;-)
Non credo che in Access si possa usare una notazione simile a quella
di MSSQL tra due linked servers (insert into
server.database.dbo.tabella from server1.database1.db.tabella1)
In ogni modo, già evitando di utilizzare un live dataset per la
tabella di destinazione si dovrebbe velocizzare notevolmente il tutto.
var
  Origine: TAdoDataset; //select * from tabella
  Destinazione: TADoQuery;
Destinazione.SQL.Text := 'Insert into tabella2 values (:param1,
:param2, :paramN)';
while not Origine.eof do 
begin
  Destinazione.Parameters[0].Value :=
Origine.FieldByname('xxxxx').Value;  
  Destinazione.Parameters[1].Value :=
Origine.FieldByname('yyyy').Value;
  //i vari campi
  Destinazione.ExecSQL;
  Origine.Next;
end;


Ciao,
scusa ma non ho ben capito:
l'operazione di trasferimento di dati che devi fare, la devi fare una
volta sola oppure deve essere eseguita spesso (io credo che tu debba
farla spesso, altrimenti i 35 secondi di cui parli non sarebbero un
problema)?.
Se l'operazione va fatta spesso allora ti consiglierei di usare gli
strumenti propri del db che utilizzi. (per esempio script TSql se usi
SqlServer o MSDE oppure, ancora meglio, i DTS).
Ciao, Rocco.

 end;
grazie Massimo Pini
ho provato a seguire iltuo suggerimento ma ci mette troppo!!!!
le tabelle da copiare sono 2 con una decina di campi
una contiente al momento un  1000 records
l'altra un 400 e ci mette 1 minuto e mezzo!!!!
non non ci credo non è normale ci deve essere assolutamente un'altro modo
:(
addirittura sono arrivati a dirmi di lavorare per tutta l'app,icazione con
entrambi i database ciò significa ogni volta fare delle query allucinanti
per poter unire i dati di un database all'altro
no no ci deve essere un modo ...

 una chiamata sql che utilizzi due DB access ...
Sei male informato ;)
INSERT INTO dati3 IN 'C:\db1.mdb'
SELECT* from dati3
--
Jax
====
I vizi hanno le virtů di rendere contenti chi li pratica e arricchire
chi li favorisce.

 no no ci deve essere un modo ...
Valuta anche se riesci ad usare la sintassi che ti ha postato Jax, 
potrebbe essere la soluzione piů performante, soprattutto con Access...
HTH
-- 
Andrea Magni

grazie Jax !!!!!!!!!!!!!!!!!!!!!!!
era proprio quello che mi serviva
cmq facevo delle prove
ehm in questo caso funziona solo se le due tabelle sono identiche
cioè stesso nome campi tipo(naturalmente)
se invece le tabelle hanno nomi di campi differenti ?
gli do i campi cme una normale query insert ma mi da errore
sicuramente sarà per una cosa sciocca
a me va già bene così
però giakkè ci siamo, illuminaci : )
ciaooooo   §(°-°)§

Ma possibile che nessuno si sia accorto che 15 post fa mi sono sbagliato.
Non mi dite che si č sbagliato anche il sistema.
Le macchine non si sbagliano mai.
Ho dimenticato il Post del dataset di destinazione.
E tra l'altro non riesco a capire come giri il codice
dell'apprendista.
Ahh.... i bei tempi quando Andrea Laforgia non mi lasciava passare la benchč
minima imprecisione.
Hoime povero. Hoime tapino.
Ciao
Mario - 
mari...@inwind.it


 sicuramente sarà per una cosa sciocca
Probabile... mostraci l'sql che gli diamo un'occhiata.
--
Jax
====
Accadono cose che sono come domande ... passano i giorni, oppure gli
anni e la vita risponde. (A.Baricco)

 minima imprecisione.
Sarà che io sono più tollerante ;-)
-- 
Andrea Magni

Jax


 possibile scrivere questo SQL?
Sinceramente? Non lo so :D
Io ho solo provato con access 2003 a fare una query di accodamento, e ti si
apre il wizard che ti chiede da dove vuoi prendere i dati... poi ho guardato
l'sql risultante. In effetti questo è l'unico modo per capire la sintassi
sql di access :)
--
Jax
====
Chi ha il coraggio di sorridere è padrone del mondo.

sql di access :)
è il metodo che utilizzo anche io :)
faccio ciò che mi serve sull'interfaccia proprietaria
poi copio-adatto-incollo sulle applicazioni ...
proverò con vesioni più vecchie di Access ...


 per poter unire i dati di un database all'altro
Beh, comuqnue quando esegui l'operazione i due DB devono essere aperti. 
Se sono Access e lo saranno sempre puoi certamente usare tecniche 
proprietarie.
HTH
--
Piero