Newsgroup: it.comp.lang.visual-basic
Titolo: rilevare una connessione ADO ad un database access

il mio problema è il seguente:
ho un sw da me scritto in vb6 che tramite ado accede ad un db access. Ad una
seconda istanza di tale sw NON deve essere permesso l'accesso al db aperto
dalla prima istanza. Premetto che vi sono connessioni diverse che vengono
aperte dalla singola istanza o dalle dll dell'applicazione. Ciò di cui ho
bisogno è sapere se esiste già una connessione aperta su un determinato
database (access) da parte di un qualsiasi 'processo' per negare l'apertura
del file ad altre istanze dell'applicaztivo. E' purtroppo impossibile aprire
il database in modalità esclusiva poichè andrebbe a buon fine solamente la
prima connessione aperta. Ho scartato la possibilità di scrivere una
qualsiasi informazione direttamente nel db...se venisse a cadere la
connessione per un qualsiasi motivo (crash dell'applicazione, fonte dati
divenuta irraggiungibile poichè residente su altro pc, ecc.) non sarebbe
possibile aggiornare eventuali informazioni di lock scritte manualmente e
sarebbe quindi impossibile aprire il db in modo immediato da una seconda
istanza. L'unica soluzione sarebbe appunto rilevare se esistono connessioni
'aperte' su un dato db da parte di un generico processo (che sia sulla
macchina o all'altro capo del mondo), ma come fare?
spero di essere stato sufficientemente chiaro, grazie in anticipo
saluti

 connessione aperta.
Vediamo se ho capito: ho una applicazione che deve aprire un db, ma solo se non
l'ha aperto qualcun altro, se ci riesce deve permettere ad altri di accedere.
Se le cose stanno così, a prima botta, farei così:
Tenterei una apertura in modalità esclusiva
se va bene richiudo e apro in modalità condivisa
Salutoni
Sergio

Roberto wrote:



Penso che sia molto difficile.
Comunque puoi rilevare se nella stessa cartella in cui è presente il db
ci sia il file Access.LockFile cioè il file di lok che creà access quando
viene aperto.
Ciao
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 quando viene aperto.
Il file NomeDatabase.ldb?
Impostazione corretta, ma se la connessione cade im modo traumatico questo file
non viene eliminato, ricadremmo nel caso della logica di lock "implementata" in
un campo del db
Salutoni
Sergio

 Sergio
Hai ragione sul fatto che se la connessione cade il lok rimane, ma non
penso che cia siano molti altri metodi.


 connessione aperta.
Proviamo a girare la cosa al contrario.
Perchè non puoi aprire una sola connessione al db e far girare tutto
l'applicativo e le sue dll su quella?
Potrebbero esserci motivi vari, ma spesso si sceglie di aprire tante
connessioni senza farci caso, mentre poteva bastarne una.
Sarebbe la soluzione al tuo problema.
Alberto

in effetti il primo reply suggerisce un corretto quanto banale controllo...
tentare semplicemente di aprire in modalità esclusiva il database...se è già
aperto restituirà un errore intercettabile...viceversa chiudere la
connessione ed accedere in modalità condivisa così come avviene
normalmente...direi che non fa una grinza...e non ci dovrebbero essere
problemi di sorta con connessioni cadute 'tragicamente'...provo
immediatamente
per ora GRAZIE davvero

 il mio problema è il seguente:
[descrizione del problema]
Ho trovato questo, spero che ti possa essere di aiuto
Questa soluzione presuppone che esista sul form una combobox fi nome
Elenco_Utenti.
   Dim cn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim i, j As Long
    Dim  stTemp As String, stUser As String, stOld As String
    cn.Provider = "Microsoft.Jet.OLEDB.4.0"
    cn.Open "Data Source=NomedeltuoDatabase"
    ' The user roster is exposed as a provider-specific schema rowset
    ' in the Jet 4 OLE DB provider.  You have to use a GUID to
    ' reference the schema, as provider-specific schemas are not
    ' listed in ADO's type library for schema rowsets
Set rs = cn.OpenSchema(adSchemaProviderSpecific, _
    , "{947bb102-5d43-11d1-bdbf-00c04fb92675}")
    'Output the list of all users in the current database.
    While Not rs.EOF
        i = Len(rs!COMPUTER_NAME)
        stUser = ""
        For j = 1 To i
           stTemp = Mid(rs.Fields(0), j, 1)
           If Asc(stTemp) > 32 Then
              stUser = stUser & stTemp
           Else
              Exit For
           End If
        Next
        If stUser <> stOld Then
            stOld = stUser
            'Debug.Print rs.Fields(0), rs.Fields(1), rs.Fields(2),
rs.Fields(3)
            If rs!CONNECTED Then
               Me.Elenco_Utenti.RowSource = Me.Elenco_Utenti.RowSource &
stUser & ";"
            End If
        End If
        rs.MoveNext
    Wend
    Me.Elenco_Utenti.Requery
    rs.Close
    cn.Close

 [descrizione del problema]








Testata su un db condiviso da + utenti e funziona.
Mi serviva proprio una cosa del genere.
Grazie.


 Grazie.
carissimo Fabio, è almeno la seconda volta, oggi, che per chiosare con tre righe
un post altrui lo riporti integralmente.
Una ripassatina alle regole del quoting potrebbe non essere inutile :-)
--
Salutoni
Sergio

ho implementato il primo suggerimento...aprire una connessione in modalità
esclusiva e, se tutto fila liscio, continuare con la modalità condivisa...
trovo pero' interessante la soluzione suggerita che utilizza il cosiddetto
'provider-specific schema' con il guid
{947bb102-5d43-11d1-bdbf-00c04fb92675} ...dove posso trovare informazioni
più dettagliate su tale schema specifico?