PDA

Visualizza la versione completa : DELPHI - Problemi con interbase


pegaso22
11-10-2003, 12:15
Ciao a tutti,
ho un problema con interbase:
ho creato un piccolo programma che utilizzo su due postazioni in rete, per la comunicazione ho usato i componenti (IBtable, IBtranslaction, Ibdatabase) che si trovano nella barra dei componenti all'interno di Interbase, il problema è il seguente:
se io dal PC1 aggiungo un record, come faccio a vederlo sul PC2 istantaneamente? Il collegamento è funzionante perchè se faccio il refresh manuale mi dà il record nuovo. Esiste un qualcosa per evitare il refresh manuale e quindi la avere la possibilità di vedere i dati inseriti o modificati in tempo reale?
Fatemi sapere grazie.

pegaso22
11-10-2003, 16:23
Qualcuno mi sà dare una mano? :cry:

alka
11-10-2003, 17:04
Calma e sangue fresco. :)

Innanzitutto, forse non avresti dovuto duplicare il thread, si poteva continuare tranquillamente in quello precedente...inoltre, ho scritto la mia prima risposta stanotte alle 3.40, quindi è probabile che debba trascorrere un po' di tempo dalla successiva, poichè ogni tanto dormo anche io...ci vuole un po' di pazienza.

In generale, posso dirti che InterBase non esegue un "lock" dei record come Access, Paradox o altri database di tipo desktop.
Si tratta di un database di tipo client/server, pertanto tutti gli utenti possono apportare contemporaneamente modifica al database, poichè ogni modifica (aggiornamenti, inserimenti, cancellazione, ecc.) avviene all'interno di una transazione, sia essa implicita o esplicita.

Ciò significa che eseguendo una serie di modifiche, il server database le memorizza e ne tiene traccia...al termine del processo, se si esegue la Commit della transazione, le modifiche apportate vengono confermate, in caso contrario, richiamando la Rollback, le modifiche vengono annullate, in modo completamente "atomico".

Generalmente, gli utenti in un sistema di questo tipo che si collegano al database non possono vedere i dati che non sono stati confermati attraverso il Commit della transazione, quindi vedranno sempre la versione precedente, eventualmente modificate da se stessi.
In definitiva, ciascuno vede le proprie modifiche, mentre quelle apportate da altri solo se "committate" (perdonami il termine).

E' possibile modificare questi criteri di visibilità, anche se io lo sconsiglio caldamente, agendo sulla proprietà Params del componente IBTransaction, che fornisce anche i metodi Commit e Rollback sulla transazione stessa.

Per configurare meglio i parametri della transazione, io farei uso del "Transaction Editor" (dal menu accessibile con il tasto destro sul componente) e imposterei la proprietà Read Committed in modo da impostare il programma affinchè vengano lette le proprie modifiche e quelle confermate tramite Commit da altri utenti in rete.

Suggerisco di usare i metodi CommitRetaining e RollbackRetaining del componente IBTransaction per evitare la chiusura dei DataSet collegati al database e aperti per la visualizzazione e la modifica dei record.

Spero di essere stato abbastanza prolisso...

La trattazione dei database client/server e InterBase è abbastanza lunga, c'è chi ci scrive dei libri, quindi non posso dilungarmi più di tanto in dettagli, anche perchè sulla rete si trova di tutto: siti amatoriali, siti con esempi, gruppi di discussione, forum, ecc.

Ciao! :ciauz:

pegaso22
11-10-2003, 17:31
Ciao Alka,
scusa se ho replicato il thread non volevo essere insistente ma premevo a chiarirmi i dubbi.

Comunque, forse la domanda che ho formulato prima non era la più adatta per risolvere i miei problemi, provo a riformulartene un altra:

SE IO MODIFICO UN RECORD DI UN DATABASE DA UNA POSTAZIONE CLIENT E POI FACCIO LA COMMIT, E' POSSIBILE CHE UN ALTRO CLIENT VISUALIZZI IL VALORE MODIFICATO IN AUTOMATICO SENZA DOVER PER FORZA AGGIORNARE MANUALMENTE?
IO PER ORA HO RISOLTO METTENDO UN REFRESH OGNI TOT SECONDI... QUESTA E' L'UNICA SOLUZIONE? LA MIGLIORE? O CE NE SONO DELLE ALTRE?

Io credevo (e credo tutt'ora) che Interbase avese la possibilità di inviare a tutti i client connessi le modifiche effettuate dopo una commit in modo tale che le tabelle fossero sempre aggiornate senza dover ricorrere ad un timer col refresh.


Un altra piccola domandina:
Come posso fare a creare un campo (ID) di un database (con IB expert 2.5) che si autoincrementi?
Col paradox è semplicissimo... qua non sembra così.

Grazie mille per la disponibilità.

alka
11-10-2003, 19:02
SE IO MODIFICO UN RECORD DI UN DATABASE DA UNA POSTAZIONE CLIENT E POI FACCIO LA COMMIT, E' POSSIBILE CHE UN ALTRO CLIENT VISUALIZZI IL VALORE MODIFICATO IN AUTOMATICO SENZA DOVER PER FORZA AGGIORNARE MANUALMENTE?
IO PER ORA HO RISOLTO METTENDO UN REFRESH OGNI TOT SECONDI... QUESTA E' L'UNICA SOLUZIONE? LA MIGLIORE? O CE NE SONO DELLE ALTRE?

No, non ci sono altri metodi, ed è giusto che sia così.
Si tratta di un database client/server, quindi devi chiudere e riaprire la query se vuoi ottenere, usando lo stesso statemente SQL, i dati aggiornati.



Io credevo (e credo tutt'ora) che Interbase avese la possibilità di inviare a tutti i client connessi le modifiche effettuate dopo una commit in modo tale che le tabelle fossero sempre aggiornate senza dover ricorrere ad un timer col refresh.

Se fosse realmente così, sarebbe un macello, poichè il traffico di rete sarebbe dieci volte superiore a quello normale!
Il refresh *deve* essere manuale, poichè i dati vengono fatti transitare solo quando richiesti, e solo se confermati come validi a tutti gli effetti. Poi, quale esigenza dovrebbe richiedere l'uso del timer o l'aggiornamento periodico?



Come posso fare a creare un campo (ID) di un database (con IB expert 2.5) che si autoincrementi?
Col paradox è semplicissimo... qua non sembra così.

Usi un campo intero e associ loro un generatore da assegnare tramite trigger.

pegaso22
11-10-2003, 19:32
Grazie degli aiuti, mi fà piacere che sto riuscendo a capire qualcosa in più. :dhò:
Spero di non disturbarti troppo prossimamente.
Ciao ciao

Loading