Newsgroup: it.comp.lang.delphi
Titolo: Accesso concorrente ad un database

Ho sviluppato un'applicazione in Delphi per la gestione di una biblioteca personale.
L'applicazione mi permette di gestire
- Libri (con la possibilità di inserimento dell'indice generale, e di uno o più autori)
- Riviste (con possibilità di inserimento degli articoli, e l'inserimento di uno o più autori)
- Per ogni articolo, la possibilità di inserimento delle parole chiavi
- Materiale Audiovisivo (Video, Musica, ecc)
Ora l'applicazione è cresciuta, e mi hanno chiesto di installarlo su più computer interconnessi.
Premetto che il database che ho usato è stato Access 97.
Il problema che sorge a questo punto è il seguente: come fare se più utenti si collegano
al database per inserire un nuovo record nella stessa tabella ?
Quando il programma funzionava su un solo computer, avevo creato un sistema di
creazione di un numero progressivo univoco per ogni nuovo record inserito, che aveva
anche lo scopo di essere una chiave primaria per la tabella in esame.
Ora, se due o più utenti si connettono al database e cercano di inserire
nuovi record nella stessa tabella (ad esempio, un nuovo libro), viene creato lo stesso
valore numerico. Questo, ovviamente, non è consentito, in quanto si creerebbero
valori duplicati per la chiave primaria.
Ho cercato informazioni in giro, ma non ho trovato molto.
Qual'è l'approccio corretto ? Non riesco a bloccare la tabella con l'istruzione
DmLibri.RegistroLibri.Locktable(...)
prima di aggiornare la tabella RegistroLibri (che contiene i progressivi generati)
e l'istruzione
DmLibri.RegistroLibri.Unlocktable(...)
per sbloccare la tabella RegistroLibri
ma questa soluzione non funziona
Qualcuno potrebbe aiutarmi, magari anche con esempio di codice già sviluppato, oppure
con link a qualche sito.
Gianni

Non ho mai lavorato con access perchè, da quello che so non consente più di
10 accessi concorrenti - e già questo è un limite(infatti è fortemente
sconsigliato soprattutto per applicazioni Internet) e perchè i componenti
Delphi sono progettati per lavorare bene soprattutto con il BDE e/o
INTERBASE .
Di solito uso il componente TSession che si occupa di generare in background
i thread necessari agli accessi concorrenti;
presumo che anche le routine che gestiscono i file MDB abbiano un meccanismo
del genere(ti sarai appoggiato ad un file TLB immagino).
Se hai Delphi 5.xx versione Enterprise potresti provare ad usare i
componenti ADO che possono interfacciarsi ad access od a qualsiasi RDBS che
supporti questa tecnologia (con qualche limitazione per i campi BLOB, etc).
In ogni caso, credo che convertire i tuoi database sia la soluzione
migliore - magari paradox (10.000-20.000 records) o meglio ancora INTERBASE.
Saluti - Marco Soravia.

Se il tuo problema è solo quello di generare gli ID delle tabelle e non ti importa nulla che questi
siano dei progressivi in senso stretto, ovvero se per te non è un problema il fatto che dall'ID 5 si
passi direttamente al 7 piuttosto che al 6, puoi risolvere il problema creandoti un tuo generatore
di progressivi che ti dia un numero nuovo ogni volta che lo chiami. Devi comunque abbandonare i
campi auotincrementanti sia che tu usi mdb, sia che usi paradox. Se la cosa ti può consolare lo
stesso problema con questo tipo di campi autoincromentanti c'è anche in MS SQL server. In sostanza
potresti gestire il tutto mediante una tabella di progressivi (uno per ogni tabella di cui devi
gestire l'ID), in cui vai a leggere il progressivo della tabella che ti interessa e lo incrementi
ogni volta che vai in insert o append sulla tabella per cui ti serve l'ID. Sembra macchinoso, ma in
realtà è abbastanza semplice costruirsi una funzione di libreria che ti faccia questo lavoro.