Newsgroup: it.comp.lang.delphi
Titolo: delphi xe7 zeos e merge mysql

Ciao a tutti,
avrei bisogno di un aiutino.
 
Sono un bel po a digiuno di programmazion e database.
ora vorrei riprendere un po e come esercizio sto facendo un programmino per un amico.
 
In pratica ora dovrei "mergiare" due database mysql, uno locale e uno remoto.
 
Sto usando componenti zeos per connettermi.
 
in pratica pensavo:
due query;
 
qrylocal(legata alla connessionene locale) e qryRemote(legata alla connessine remota).
 
qryLocal la uso per select su tabella locale, la ciclo e con qryremote inserisco le righe della qryLocale.
 
 
ciclando poi dovrei controllare se la rga in questione della qrylocal è piu aggiornata (se esiste) della riga della qryRemote.
 
 
per ora mi sono limitato solamente all'inserimento.... ma noto che è davvero lentissimo.... 
 
posto ciò che ho fatto:
 
codice:
Qrylocal.SQL.Text:='selectrom anagrafica';
Qrylocal.Open;
while not Qrylocal.Eof do
begin
    QryRemote.Append;
    connectionRemote.StartTransaction;
    for i := 0 to Qrylocal.FieldCount-1 do
        QryRemote.Fields[i].Value:=Qrylocal.Fields[i].Value;
 
 
    QryRemote.Post;
    ConnectionRemote.Commit;
    Qrylocal.Next;
end;
 
 
ma è davvero lento, per fare 100 righe ci mette 10 secondi..... otenzialmente potrebbero essere 8000...
 
senza contare che sto solo inserendo, senza controllare che ci siano da fare update ecc..
 
non c'e' un modo piu veloce... magari inserendo di botto tutti i dati della qrylocale in una tabella ed eventualmente poi tramite store fare i vari controlli per l'aggiornamento della table?.
 
 
grazie a tutti.

 Sto usando componenti zeos per connettermi.
 
Che versione di delphi?
xche zeos?
xche vai in append e non usi una query INSERT INTO?
xche inizi una transazione ad ogni insert?
 
 
A.

innanzitutto grazie per la risposta.
delphi ho la xe7.
uso zeos perche mi era stato consigliato, mi sembra funzioni bene, cosa potrei usare in alternativa?.
 
Dici che usando una query e insert con paramentri possa essere più veloce?  (provero').
 
 
uno transazione ogni insert perche altrimenti mi da errore.....
a dirla tutta credevo di fare la commit solo dopo alla fine del ciclo.. ma se la metto la... non mi inserisce nulla e mi trovo la tabella vuota.


Il giorno lunedì 20 aprile 2015 20:16:24 UTC+2, ladius ha scritto:
ops..scordavo.. benchmark non lo uso perche purtroppo questa operazione di merge dovrà essere fatta tipo ogni sera.... per 8 computer verso un server...e nessuno degli utenti sa neanche cosa sia mysql o database.


 uno transazione ogni insert perche altrimenti mi da errore.....
 
Magari ti sei perso, ma questo non è un NG di utenti finali.
Che kaz vuol dre "mi da errore"???
 
 
A.

 be.
 
A tal proposito se può essere utile riporto la mia esperienza.
Ho utilizzato zeos con firebird e delphi 7 (a dirla tutta 
l'applicazione è ancora utilizzata).
Per cose "semplici" funziona.
Appena ci vuoi fare cose normali, devi cominciare a sbattere la testa 
contro zeos. :-? :-[
Ergo, per un nuovo progetto non lo consiglierei a nessuno.
 
-- 
Emanuele Desideri
 
 

zeos mi era stato cnsigliato effettivamente da gente che ne aveva sentito parlare..
 
provero' quindi utilizzando firedac.
 
Pero' non credo si possa passare da 100 secondi a 10.
Vi spiego ciò che dovrei fare, magari avete idee migliori ^_^
 
il mio problema è in sostanza devo sincronizzare un database mysql su un server con N database mysql montati su una decina di portatili.
 
questi portatili lavorano in locale dato che non hanno a disposizione una connessione.
 
quindi a fine giornata dovranno "mergiare" e sincronizzarsi con un server centrale.
 
 
grazie a tutti per l'attenzione ^_^


 Pero' non credo si possa passare da 100 secondi a 10.
 
Il "credo" lasciamolo ai preti.
Le cose si PROVANO.
 
A.

Ok, ritiro tutto:
 
1000 record in 42 secondi...
 
 
usando tfdconnection e tfdquery 
 
posto il codice:
 
 
 
  dm.QryLocal.SQL.Text :='select * from anagrafica';
  dm.QryLocal.Active:=true;
  bar.Min:=0;
  bar.Max:=1000;
  bar.Position:=0;
  j:=1;
 
  dm.ConnRemote.StartTransaction;
  dm.QryRemote.SQL.Text:='insert into anagrafica ';
  dm.QryRemote.SQL.Add('(ID, CODICE, NOME, EMAIL)');
  dm.QryRemote.SQL.Add(' VALUES ');
  dm.QryRemote.SQL.Add('(:ID,');
  dm.QryRemote.SQL.Add(' :CODICE,');
  dm.QryRemote.SQL.Add(' :NOME, :EMAIL)');
 
  while not dm.QryLocal.Eof do
  begin
 
    //  purroppo mi da errore, ho dovuto settare tutti i parametri 
    //  for i := 0 to dm.QryLocal.FieldCount-1 do
    //    dm.QryRemote.Params[i].Value:=dm.QryLocal.Fields[i].Value;
 
    dm.QryRemote.ParamByName('ID').AsInteger:=Dm.QryLocal.FieldByName('ID').AsInteger;
    dm.QryRemote.ParamByName('CODICE').AsString:=Dm.QryLocal.FieldByName('CODICE').AsString;
    dm.QryRemote.ParamByName('NOME').AsString:=Dm.QryLocal.FieldByName('NOME').AsString;
    dm.QryRemote.ParamByName('EMAIL').AsString:=Dm.QryLocal.FieldByName('EMAIL').AsString;
 
    dm.QryRemote.ExecSQL;
 
    bar.Position:=bar.Position+1;
    inc(j);
 
    dm.QryLocal.Next;
 
    if j=1000 then
    begin      
      dm.ConnRemote.Commit;
      exit;
    end;


prova a togliere bar.Position:=bar.Position+1;  e vedi se riesci ad 
abbattere ancora di più il tempo

>     //  purroppo mi da errore, 
Ma ti si deve pregare in ginocchio per capire che kaz di errore ti da in modo da poterti aiutare?
Se un utente ti chiama e ti dice "ho un errore" auale è la prima cosa che chiedi, la taglia delle mutande??
 
 
 
Hai un loop sui dati che fa esplicitamente riferimento ad un oggetto di interfaccia utente.
QUESTO E' UN ERRORE.
 
Poi, sai che un cursore puo' essere unidirezionale?
Hai approfondito questo aspetto?
 
A.