Connessione al database usando Visual Basic? Lo trovi su Opentraining.it Visual Basic Italia
Guide e Tutorials:indexed
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)



    Archivio:ndexed
    Lezioni Commenta questa lezione Invia la tua guida Avviso per le nuove lezioni
    Proponi un argomento

    Visual Basic Italia© copyright 2000 - tutti i diritti riservati
    E-mail:
    vbitalia@libero.it