grazie 1000! Ma non capisco una cosa....che percorso devo mettere nella stringa...cioè se il db è sulla cartella condivisa del pc2 per esempio metto: \\pc2\nomeCartellaCondivisa ?
e dove? Nel source? cioè...la stringa come va scritta?![]()
grazie 1000! Ma non capisco una cosa....che percorso devo mettere nella stringa...cioè se il db è sulla cartella condivisa del pc2 per esempio metto: \\pc2\nomeCartellaCondivisa ?
e dove? Nel source? cioè...la stringa come va scritta?![]()
La stringa la dovrai comporre con delle parti costanti e delle parti variabili. Tipo...
sConnectionString = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=" & sPercorsoDb
sPercorsoDb è una variabile che dovrai valorizzare leggendo qualcosa di esterno al programma, per esempio un file .INI, in modo che possa essere diversa sui diversi PC.
Sul sito di gibra (vbnuke... qualche cosa) puoi trovare (credo che ci sia ancora) un intero progetto in cui è esemplificata questa tecnica (e molte altre cose).
Ho realizzato diversi programmi che usano un db Access alcuni dei queli usato anche da circa 15 utenti, e tutt'ora funzionano senza problemi.Originariamente inviato da Veronica80
tenete conto che sto programma lo useranno 2 max max 3 persone quindi non c'è un trafficon intenso! Se non si può accedere esclusivamente pazienza si coordinano loro
io vorrei solo sapere come accedere a un db acces in rete!
Nella stringa:
che mi pare sia quella ch eserve a me non capisco come gestire la cosa visto che il percorso è sempre su C:\codice:Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\mydatabase.mdb;Jet OLEDB:System Database=system.mdw;
Però devi gestire i dati ed il database in maniera perfetta, altrimenti avrai delle grane a non finire. In linea generale ecco i passi da seguire:
1. Database e Programma li installi in una cartella condivisa nel tuo server.
Sul client vanno SOLO installate eventualmente le librerie (OCX & DLL) usate dal tuo programma. Sui computer Client creerai un link al programma che sta sul server.
In questo modo, quando dovrai aggiornare il programma, lo aggiorni solo sul server, a meno che non devi installi nuove librerie (OCX/DLL) nel qual caso vanno aggiornate anche sui Client.
2. il DataSource della tua stringa di connessione al db sarà questo:
\\NomeServer\NomeCondivisione\mydatabase.mdb
3. Riguardo alla "concorrenza dei dati" che siano 2 o 10 utenti le problematiche sono sempre le stesse, e le regole non cambiano.
NON (ripeto NON) usare il contatore di Access, che è una ciofeca paurosa in multiutenza.
Devi usare un campo contatore personalizzato (vedi dopo).
4. Per aggiornare i dati io uso il più possibile il metodo Execute della connessione (o del Command + Parametri, dipende dai casi) incapsulando tassativamente il tutto in una transazione.
Evitare i metodi del recordset (es. rs.Update) che sono molto più lenti. Ricorda che in una rete LAN letterua e scrittura generano traffico, meno se ne genera meglio è.
5. Evitare assolutamente i "SELECT * " ma elencare solo i campi strettamente necessari all'interrogazione.
6. Il database Access non dispone di un Lock, quindi lo devi gestire tu.
Vi sono diverse strategie ed ognuno usa quelle che ritiene adatte.
Personalmente non applico alcun Lock, però verifico prima di salvare se il record è stato modificato da un'altro utente.
Questo prevede che in OGNI tabella tu abbia almeno 2 campi: UserName e DataModifica.
Quando 2 utenti caricano lo stesso record, chi lo salva per primo avrà successo, il secondo utente invece riceverà un messaggio che li dice che deve ricaricare il record, perchè è stato modificato da un altro utente (tramite un apposito pulsante che ricaricherà appunto il record): ciò avviene perchè prima di salvare verifico la DataModifica nel record: se quella del database è maggiore di quella caricata dall'utente B, significa che quel record è stato modificato.
Sono anni che uso questa strategia ed i clienti sono contenti, nessun problema di concorrenza o altro.
7. Devi implementare una routine alla chiusura del programma che compatti il database, gestendo ovviamente l'errore se il database è ancora in uso da un'altro utente.
In questo modo la compattazione sarà eseguita dall'ultimo utente che usa il computer.
In NET non esiste niente di nativo per questo, quindi si utilizza la vecchia libreria JRO:
HOW TO: Comprimere un database di Microsoft Access Database con Visual Basic .NET
http://support.microsoft.com/kb/306287
8. Pianificiare un BACKUP GIORNALIERO del database!!!
9. Come ultima cosa, la più importante!
Occorre implementare una gestione degli errori impeccabile (io uso un gestore in ogni routine!) altrimenti quanto detto sopra diventa inutile.
Solo attuando una corretta strategia potrei ottenere ottimi risultati.
Ed ecco alcuni link che ritengo importantissimi, indispensabili da leggere, se vuoi fare le cose fatte bene tutti relativi alla multi-utenza:
HOW TO Implement Multiuser Custom Counters in Jet 4.0 and ADO 2.1
http://support.microsoft.com/default...b;EN-US;240317
How to use connection control to prevent users from logging on at run time in Access 2002
http://support.microsoft.com/kb/287655/en-us
Determine Which and How many Users are Connected to a Database
http://www.freevbcode.com/ShowCode.Asp?ID=4768
How to keep a Jet 4.0 database in top working condition
http://support.microsoft.com/kb/303528
Introduction to .ldb files in Access 2000
http://support.microsoft.com/kb/208778/en-us
How to determine who is logged on to a database by using Microsoft Jet UserRoster in Access 2000
http://support.microsoft.com/kb/198755/EN-US/
NOTA: Scusa, ma "System Database=system.mdw" cosa c'entra ? Mi sembra un retaggio dell'ambiente MSAccess...![]()
![]()
Ciao Gibra!
Mi scuso per la risposta tarda! Che dire! Grazie! Non potevi essere più preciso!
L'unica cosa che non ho capito è sul punto 1. Dove mi dici che sul client devo installare SOLO le librerie. (perchè?).
Tieni conto che per quel che serve a me non mi serve una multiutenza! I pc che useranno il programma son 2. Uno difronte all'altro. Quindi posso mettere anche un controllo che se uno degli utenti apre il programma l'altro non lo può aprire (non è un programma che va usato continuamente) anche se non ho idea di come fare!![]()
Per il resto credo di aver immagazinato tutto e ti ringrazio per la chiarezza e la precisione!
GRAZIIEEEE!
![]()
Il programma lo devi mettere sul Server, non sul Client, per il semplice fatto che quando fai un aggiornamento ti basta aggiornare solo sul Server, e sei sicura al 100% che il programma sarà sempre aggiornato. Come ho già detto, vale anche per il database.Originariamente inviato da Veronica80
Ciao Gibra!
Mi scuso per la risposta tarda! Che dire! Grazie! Non potevi essere più preciso!
L'unica cosa che non ho capito è sul punto 1. Dove mi dici che sul client devo installare SOLO le librerie. (perchè?).
Tieni conto che per quel che serve a me non mi serve una multiutenza! I pc che useranno il programma son 2. Uno difronte all'altro. Quindi posso mettere anche un controllo che se uno degli utenti apre il programma l'altro non lo può aprire (non è un programma che va usato continuamente) anche se non ho idea di come fare!![]()
![]()
Il Client ha solo bisogno delle librerie perchè anche se chiamato 'nel Server' il programma viene eseguito sempre in locale quindi nel Client devi installare le librerie (OCX, DLL, ...) che servono al programma.
Per avere l'accesso esclusivo ti basta impostare nella connessione al MDB la modalità esclusiva (vedi la guida per i dettagli) gestendo l'errore all'apertura della connessione, ad esempio facendoti restituire un valore BOOL che ti informi se la connessione ha avuto successo o meno. Ovviamente, il primo utente che apre il database con accesso esclusivo avrà successo, il secondo riceverà un errore.
Sconsiglio caldamente l'avvio dal Load del form principale, ma è sempre meglio farlo dalla routine SubMain in un modulo bas, esempio modMain.bas . In questo modo non ci sarà alcun problema a chiudere l'applicazione usando End senza provocare danni perchè non ci sarà alcun oggetto istanziato.
Esempio (scritto al volo, quindi da controllare!):
codice:' in modMain.bas Public CN As ADODB.COnnection Public SubMain() Dim bSuccesso As Boolean bSuccesso = ApriConnessione() If not bSuccesso Then MsgBox "Un'altro utente sta già eseguendo il programma." & vbCrLf & _ "Impossibile accedere al database.", vbCritical Set CN = Nothing End End If ' Tutto bene, posso aprire l'applicazione Load frmMain frmMain.Show End Sub Public Function ApriConnessione() As Boolean Dim sConnectionString As String Dim sPercorsoDB As String On Error GoTo ERR_HANDLER sPercorsoDB = "\\Server1\MyApp\Database.mdb" sConnectionString = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=" & sPercorsoDB sConnectionString = sConnectionString & ";Persist Security Info=False" Set CN = New ADODB.Connection With CN .ConnectionString = sConnectionString .Mode = adModeShareExclusive .CursorLocation = adUseClient .Open End With ApriConnessione = True On Error GoTo 0 Exit Function ERR_HANDLER: MsgBox Err.Number & vbcrlf & Err.Description End Function![]()
Scusa, non mi ricordavo che usi VB.NET mentre il codice è per VB6.![]()
Comunque il concetto è identico e l'implementazione pure, modifica le istruzioni per VB.NET.
Sorry
![]()
ciao a tutti,
ho letto per caso questo forum e in parte avete gia' risolto il mio problema, ma manca qualcosa. Vadio a spiegare.
Ho sviluppato una applicazione in VB . net (Express Edition 2008) che si poggia su un db ACCESS. Ho utilizzato OleDbConnection e Provider=Microsoft.Jet.OLEDB.4.0.
Il data base ha pero' necessita' di condivisione su rete LAN. Mi chiedevo, per gestire gli automatismi della condivisione come posso fare? dalla documentazione ingiro non mi pare che l'apertura di una connessione eviti ad un altro utente di effettuare modifiche sulla stessa tabella. Giusto?
Ho in mente una soluzione alternativa che sarebeb passare a MySql. Anche qui pero' no sono sicuro che l'automatismo poso delegarlo a MySql stesso.
Ad ogni modo vorrei evitare di "uccidere una mosca con la bomba atomica" visto che l'applicazione non ha moltissimi dati e solo 2-3 utenti. (vero che il problema di 2 e' il problema di 100, ma...).
Sostanzialmete: cosa consigliate? se rimango su access che accorgimenti devo prendere per evitare conflitti di scrittura sul solito record?
Grazie in anticipo
Simone
Non risollevare discussioni altrui e vecchie di mesi: come indicato nel Regolamento, apri una nuova discussione seguendo le norme indicate per affrontare il tuo problema.Originariamente inviato da simone.orlandi
ciao a tutti,
ho letto per caso questo forum e in parte avete gia' risolto il mio problema, ma manca qualcosa. Vadio a spiegare.
Ho sviluppato una applicazione in VB . net (Express Edition 2008) che si poggia su un db ACCESS. Ho utilizzato OleDbConnection e Provider=Microsoft.Jet.OLEDB.4.0.
[...]
MARCO BREVEGLIERI
Software and Web Developer, Teacher and Consultant
Home | Blog | Delphi Podcast | Twitch | Altro...