Uso degli ADO in Visual Basic 6 di Nicola Pietralunga (Undicesima parte)
Presentiamo in queste pagine il tutorial relativo all'uso degli ADO in Visual Basic 6.0
scritto da Nicola Pietralunga l'8 Aprile 1999.
Chi volesse porre domande sull'argomento può rivolgersi direttamente all'Autore di cui riportiamo
l'indirizzo email: nicola@omeganet.it oppure inserire
un annuncio nella rubrica 'Chiedilo agli esperti'.
Come si legge dal comunicato dell'Autore, la riproduzione del testo e dei files che lo accompagnano
deve essere necessariamente preceduta dall'autorizzazione dello stesso, tranne naturalmente nel caso
di uso personale. |
L’oggetto Command
Nella form frmAnzianità si può vedere un esempio di utilizzo dell’oggetto Command di ADO.
La form ipotizza che si abbia la necessità di interrogare l’archivio dei Programmatori per estrarre quelli che superano un certo livello di anzianità, i quali vengono presentati in ordine discendente di anzianità. I reocrd vengono visualizzati in una griglia MSHFlexGrid (Hierarchical FlexGrid) che è la griglia del VB6 che sostituisce la FlexGrid nell’utilizzo con gli ADO.
Inizialmente l’elenco comprende tutti i programmatori, successivamente è possibile filtrare i record inserendo un numero nella Textbox ed utilizzando il pulsante Elabora (definito come pulsante di Default, perciò è sufficiente premere Invio quando ci si trova sulla Textbox).
L’estrazione dei record che rispettano la condizione dell’anzianità minima avviene utilizzando una query con parametri salvata nel database (qryAnzianita) che mette in relazione le tabelle Programmatori e Linguaggi sulla base del contenuto del campo contenente il codice linguaggio. Si potrebbe anche utilizzare una query creata al volo il cui statement SQL sarebbe
"SELECT Programmatori.Cognome, Programmatori.Nome, Linguaggi.Descrizione, Programmatori.MesiAnzianita FROM Programmatori INNER JOIN Linguaggi ON Programmatori.LinguaggioPrincipale = Linguaggi.Codice WHERE Programmatori.MesiAnzianita >= " & ValoreMinimo & " ORDER BY Programmatori.MesiAnzianita DESC;".
L’utilizzo di una query precompilata e salvata nell’MDB fornisce prestazioni leggermente migliori rispetto alla creazione della query "al volo", questo perché il Jet non deve compilare la query quando questa viene richiamata dal codice del programma VB (tramite gli oggetti ADO).
La sezione Dichiarazioni, la sub Form_Load e quella Form_Unload rispecchiano quelle che abbiamo già visto in precedenza; ovvero abbiamo la dichiarazione, l’istanza e, alla fine, la distruzione degli oggetti Connection e Recordset. Ovvero partendo dalle dichiarazioni
Private cnGriglia As ADODB.Connection 'Connessione utilizzata dalla form
Private rsGriglia As ADODB.Recordset 'Recordset utilizzato per popolare la
'griglia
Private Sub Form_Load()
Set cnGriglia = New ADODB.Connection
cnGriglia.CursorLocation = adUseClient
Set rsGriglia = New ADODB.Recordset
rsGriglia.CursorLocation = adUseClient
cnGriglia.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.3.51;Data Source=AdoTutor.mdb"
CreaRecordset 0
End Sub
Private Sub Form_Unload(Cancel As Integer)
Set cnGriglia = Nothing
Set rsGriglia = Nothing
Unload Me
Set frmAnzianita = Nothing
End Sub
|
Come si può notare ho scelto di utilizzare cursori lato Client; a scopo dimostrativo e al fine di risparmiare risorse (e a differenza di quanto succedeva nella form precedente) la connessione ed il recordset vengono aperti ogni volta che si lancia la query e subito richiusi. Questo, in caso di database Client/Server, migliora le prestazioni del DataBase (che può così dedicarsi ad altro) e garantisce una migliore scalabilità; d’altro canto il tempo di interrogazione risulta un po’ più lungo, dovendo ogni volta ristabilire la connessione.
La proprietà ConnectionString viene settata una volta per tutte nell’evento Form_Load; in questo caso, ciò consente un piccolo risparmio perché non è più necessario passare tale argomento ad ogni richiamo del metodo Open della Connection.
L’estrazione dei record ed il popolamento della griglia avviene per effetto della sub CreaRecordset, alla quale viene passato come argomento il valore minimo dei mesi di anzianità da ricercare (come detto e come si può vedere dal codice sopra, alla partenza vale zero e quindi vengono estratti i record di tutti i programmatori).
Private Sub CreaRecordset(inpMinimo As Integer)
Dim cmdAnzianita As ADODB.Command
Dim prmMinAnzianita As ADODB.Parameter
cnGriglia.Open
Set cmdAnzianita = New ADODB.Command
cmdAnzianita.ActiveConnection = cnGriglia
cmdAnzianita.CommandText = "qryAnzianita"
cmdAnzianita.CommandType = adCmdTable
Set prmMinAnzianita = cmdAnzianita.CreateParameter("inpMinAnzianita", _
adInteger, adParamInput, , inpMinimo)
cmdAnzianita.Parameters.Append prmMinAnzianita
rsGriglia.Open cmdAnzianita, , adOpenForwardOnly, adLockReadOnly
Set hfgProgrammatori.DataSource = rsGriglia
Set prmMinAnzianita = Nothing
Set cmdAnzianita = Nothing
rsGriglia.Close
cnGriglia.Close
End Sub
|
All’inizio della routine vengono definite le variabili oggetto Command e Parameter necessarie per eseguire la query con parametri memorizata nel DataBase.
Dopo l’apertura della connessione (cnGriglia.Open) viene istanziato l’oggetto Command e vengono settate le sue proprietà: l’ActiveConnection rappresenta la connessione sulla quale eseguire il comando; il CommandText è il comando SQL, la query o la Stored Procedure da eseguire (in questo caso, come detto, è la query qryAnzianita salvata nel DataBase); il CommandType identifica, come per l’oggetto Recordset, il tipo di comando (è da notare che le query salvate nel database MDB vengono viste da ADO come se fossero tabelle, ecco perché il valore adCmdTable).
L’oggetto Parameter viene creato per effetto del metodo CreateParameter dell’oggetto Command al quale possono essere passati cinque argomenti (dico possono e non devono perché, in alternativa, è possibile settare le relative proprietà dell’oggetto Parameter, dopo la sua creazione):
- Il parametro Name è il nome del comando (in questo caso "inpMinAnzianita").
- Il parametro Type è il tipo e può assumere numerosi valori; nel caso di tipi che non presuppongono una lunghezza fissa (come per esempio adVarChar che rappresenta le stringhe) dovrà essere specificata anche la dimensione (qui non è necessario essendo un tipo adInteger).
- Il parametro Direction stabilisce la direzione nell’uso del parametro da parte della query (in questo caso è un parametro di input, cioè che serve alla query prima di eseguire la sua elaborazione).
- Il parametro Size in questo caso, come detto, non deve essere specificato essendo implicito nel tipo (Integer = 4 byte con segno).
- Infine il parametro Value che rappresenta il valore vero e proprio da passare alla query come parametro.
Dopo essere stato creato e una volta che tutte le proprietà necessarie sono state settate, l’oggetto Parameter può essere aggiunto alla Collection Parameters.
Tutto è pronto per l’apertura del Recordset basato sull’esecuzione del comando; da notare l’assenza, nel metodo Open del Recordset, della Connection da utilizzare in quanto già presente nell’oggetto Command e quindi implicita.
In questo caso utilizzo il cursore meno dispendioso (ForwardOnly) dovendo semplicemente popolare una griglia.
Il popolamento della Hierarchical Flexgrid avviene associando il controllo alla fonte dati costituita dal recordset; infatti in VB6 e utilizzando ADO è possibile lavorare con controlli associati anche indipendentemente da un controllo Data, semplicemente settando la proprietà DataSource del controllo.
Alla fine della routine gli oggetti Parameter e Command vengono distrutti, mentre Connection e Recordset vengono solamente chiusi, potendo così essere riutilizzati in occasione di una successiva elaborazione.
Resta solo da vedere cosa accade alla pressione del pulsante Elabora.
Private Sub cmdElabora_Click()
If Not IsNumeric(txtMinAnzianita) Then Exit Sub
CreaRecordset CInt(txtMinAnzianita)
txtMinAnzianita.SetFocus
txtMinAnzianita.SelStart = 0
txtMinAnzianita.SelLength = Len(txtMinAnzianita)
End Sub
|
Ad ogni pressione del pulsante il DataBase viene reinterrogato.
Anzitutto si controlla che la Textbox contenga un numero (se no si esce subito dalla sub), poi viene richiamata la routine CreaRecordset, che abbiamo già visto, passando come argomento il numero contenuto nella Textbox convertito in Integer; per effetto di questa routine la griglia viene nuovamente popolata. Infine viene ridato il focus alla Textbox evidenziandone l’intero contenuto in modo da essere pronti per un successivo inserimento.
Ovviamente, anche in questo caso, le routine sono assai migliorabili ed hanno solo scopo dimostrativo; è facile trovare le condizioni per generare un errore irreversibile, non gestito, che blocchi l’applicazione.
Con questo abbiamo terminato l’esame della semplice applicazione AdoTutor e delle tecniche in essa contenute; ritengo con ciò di aver potuto fornire una panoramica abbastanza completa delle nozioni e degli accorgimenti per poter iniziare a programmare con gli oggetti ADO e delle differenze esistenti con i DAO. |
Indietro (Inserimenti, cancellazioni, modifiche) | Indice | Avanti (Considerazioni finali)
|