Un po' di tempo fa, durante lo sviluppo di un'applicazione, ho avuto l'esigenza di gestire in modo "manageriale" un database Access.
Per gestione manageriale intendo che, l'applicazione che stavo sviluppando, non doveva gestire i dati presenti nel DB (o almeno, non solo), piuttosto era necessario analizzarne la struttura e, se il caso, modificarla.
Da qui è nata la necessità di consentire all'utente anche la possibilità di attribuire una password ad un DB che non la possedeva, o di eliminarla se questa era presente o, ancora, di modificare quella esistente a favore di un'altra.
Tengo a precisare che questa non è una guida per eliminare in modo illegale la password di un DB Access - visto che la password, se impostata, deve essere nota - ma solo un modo per gestire da codice delle operazioni che, normalmente, sarebbe necessario svolgere direttamente sul DB, con l'obbligatoria presenza del pacchetto Office installato sulla macchina in uso.
Quello che ci consentirà di inserire/modificare/cancellare la password dal nostro .mdb è il modello ad oggetti della libreria ADO, ovvero la Microsoft ActiveX Data Object 2.8. Ricordiamoci di referenziarla tra i riferimenti del nostro progetto, una volta aperto Visual Basic 6.
In realtà ADO è solo un "mezzo" e di per sè non possiede la possibilità di agire direttamente sulla password del DB, piuttosto ci servirà da tramite per lanciare verso il DB delle frasi SQL atte a variare la password dello stesso. Per "variare" si intende ovviamente una qualsiasi tra le operazioni di mofifica, inserimento o cancellazione.
Una cosa importante è che, per agire sullo stato della password, il DB Access deve essere aperto in modalità esclusiva, quindi è un'operazione che andrebbe fatta al difuori delle normali attività eseguite su un DB: inserimento, cancellazione e modifica dei dati presenti nelle tabelle.
Tornando all'esigenza oggetto di questo articolo, per facilitarmi il compito e rendere il codice sorgente dell'applicazione più flessibile e ordinato, ho pensato di creare una Classe, contenente proprietà e metodi che permettono, in maniera immediata, di raggiungere le funzioni che ci servono per aprire e chiudere il DB e, di conseguenza, variarne la password. La Classe, è stata ridotta all'essenziale, visto che viene presentata al solo scopo dimostrativo di questa particolare esigenza, ma ritengo che con un minimo di impegno si possa espandere, per includervi ulteriori funzionalità e caratteristiche.
Le proprietà della Classe:
- DBProvider, consente di specificare un provider diverso da quello già impostato di default, ovvero il Microsoft Jet OLEDB 4.0;
- DBName, è il nome completo di percorso del DB sul quale intendiamo agire;
- DBPassword, è la password da specificare se questa è eventualmente già posseduta dal DB da aprire;
- DBCursor, rappresenta il tipo di cursore che si intende utilizzare per aprire il DB. Quello di default è "Lato Server";
- DBConnection, di sola lettura, consente di ricevere il riferimento alla connessione del DB aperto. Questo consente di sfruttare questo oggetto per necessità diverse da quelle che si prefigge la Classe, ad esempio per aprire un Recordset o per lanciare una SQL attraverso il metodo Execute.
I metodi della Classe:
- OpenDB, attraverso il quale valorizzando il parametro Exclusive, è possibile aprire il DB in modalità esclusiva. Diversamente verrà aperto in modalità condivisa;
- CloseDB, chiude la connessione attiva;
- AddDBPassword, aggiunge una password al DB (richiede una nuova password)
- ChangeDBPassword, cambia la password esistente (richiede vecchia e nuova password)
- RemoveDBPassword, rimuove la password esistente (richiede la password corrente)
Per inserire il codice sotto riportato, basta seguire i seguenti passi:
- Aprire un nuovo progetto Visual Basic 6;
- Referenziare la Microsoft ActiveX Data Object 2.8 (Progetto > Riferimenti...);
- Aggiungere un Modulo di Classe (Progetto > Inserisci modulo di classe);
- Copiare il codice nel modulo debitamente rinominato in cDBManaging.
Dim m_DBName As String Dim m_DBPassword As String Dim m_DBCursor As ADODB.CursorLocationEnum Dim m_DBConnection As ADODB.Connection Dim m_DBProvider As String '_________________________________________________________________ Const sProvider As String = "Microsoft.Jet.OLEDB.4.0" Function OpenDB(Optional Exclusive As Boolean = False) As Boolean Dim cnString As String On Error GoTo Open_Error connString = "Provider=" & m_DBProvider & "; " & _ "Data Source=" & m_DBName & "; " & _ "Jet OLEDB:" & _ "Database Password=" & m_DBPassword & ";" If Not m_DBConnection Is Nothing Then If m_DBConnection.State = adStateOpen Then m_DBConnection.Close End If End If Set m_DBConnection = New ADODB.Connection If Exclusive Then m_DBConnection.Mode = adModeShareExclusive End If m_DBConnection.CursorLocation = m_DBCursor m_DBConnection.Open connString OpenDB = True Exit Function Open_Error: OpenDB = False End Function '_________________________________________________________________ Function CloseDB() As Boolean On Error GoTo Close_Error If Not m_DBConnection Is Nothing Then If m_DBConnection.State = adStateOpen Then m_DBConnection.Close Set m_DBConnection = Nothing End If End If CloseDB = True Exit Function Close_Error: CloseDB = False End Function '_________________________________________________________________ Property Let DBName(ByVal new_Value As String) m_DBName = new_Value End Property '_________________________________________________________________ Property Get DBName() As String DBName = m_DBName End Property '_________________________________________________________________ Property Let DBPassword(ByVal new_Value As String) m_DBPassword = new_Value End Property '_________________________________________________________________ Property Get DBPassword() As String DBPassword = m_DBPassword End Property '_________________________________________________________________ Property Let DBCursor(ByVal new_Value As ADODB.CursorLocationEnum) m_DBCursor = new_Value End Property '_________________________________________________________________ Property Get DBCursor() As ADODB.CursorLocationEnum DBCursor = m_DBCursor End Property '_________________________________________________________________ Property Let DBProvider(ByVal new_Value As String) m_DBProvider = new_Value End Property '_________________________________________________________________ Property Get DBProvider() As String DBProvider = m_DBProvider End Property '_________________________________________________________________ Property Get DBConnection() As ADODB.Connection Set DBConnection = m_DBConnection End Property '_________________________________________________________________ Private Sub Class_Initialize() DBCursor = adUseServer DBProvider = sProvider End Sub '_________________________________________________________________ Function AddDBPassword(NewPassword As String) As Boolean On Error GoTo Err_Handling Dim sCommand As String If DBConnection.Mode <> adModeShareExclusive Then AddDBPassword = False Exit Function End If sCommand = "ALTER Database Password `" & NewPassword & "` ``" DBConnection.Execute sCommand AddDBPassword = True Exit Function Err_Handling: AddDBPassword = False End Function '_________________________________________________________________ Function RemoveDBPassword(CurrentPassword As String) As Boolean On Error GoTo Err_Handling Dim sCommand As String If DBConnection.Mode <> adModeShareExclusive Then RemoveDBPassword = False Exit Function End If sCommand = "ALTER Database Password `` `" & CurrentPassword & "`" DBConnection.Execute sCommand RemoveDBPassword = True Exit Function Err_Handling: RemoveDBPassword = False End Function '_________________________________________________________________ Function ChangeDBPassword(CurrentPassword As String, NewPassword As String) As Boolean On Error GoTo Err_Handling Dim sCommand As String If DBConnection.Mode <> adModeShareExclusive Then ChangeDBPassword = False Exit Function End If sCommand = "ALTER Database Password `" & NewPassword & "` `" & CurrentPassword & "`" DBConnection.Execute sCommand ChangeDBPassword = True Exit Function Err_Handling: ChangeDBPassword = False End Function
L'uso della classe è molto semplice e bastano poche righe per aprire un DB ed agire sulla password.
Per prima cosa la classe va dichiarata, normalmente è meglio inserire questa riga nella sezione dichiarazioni del modulo:
Dim myDB As cDBManagingPoi possiamo passare all'utilizzo vero e proprio, istanziandola e valorizzandone le proprietà che ci servono:
Set myDB = New cDBManaging With myDB .DBCursor = adUseClient .DBName = "C:\PercorsoDelDB\NomeDelDatabase.mdb" .DBPassword = "Password" 'Obbligatoria, nel caso il DB ne possegga già una If Not .OpenDB(True) Then 'Apro in modalità esclusiva MsgBox "Si è verificato un errore nell'apertura del DB" End If End WithPer aggiungere una password:
myDB.AddDBPassword "NuovaPassword"
Per variare la password esistente con una nuova:myDB.ChangeDBPassword "VecchiaPassword", "NuovaPassword"Per eliminare la password:
myDB.RemoveDBPassword "VecchiaPassword"
Tutte i metodi, restituiscono un valore booleano attraverso il quale è possibile controllare la buona riuscita dell'operazione, come nel caso della OpenDB. In quel caso il valore booleano viene utilizzato per determinare se il DB è stato aperto oppure no, nel qual caso, viene rilasciato un avviso all'utente.
Nel caso abbiate dubbi od osservazioni, non esitate a proporre i vostri commenti.


























Commenti
N.B. La risposta mi è indispensabile
Il codice necessario ad istanziare la Classe (quello da Dim myDB As cDBManaging in poi) puoi inserirlo dove più ti serve, sia direttamente nel Form dal quale intendi usarlo, o in un Modulo, magari dentro una Sub da richiamare da altri punti del progetto.
Se inserisci il codice nel Form, ovviamente devi inserirlo in una routine di evento, ad esempio nell'evento click di un pulsante.
RSS feed dei commenti di questo post.