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 (Decima 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.


Inserimenti, cancellazioni ricerche e modifiche

Gli ultimi tre Case contenuti nella Sub cmdAzione_Click riguardano la creazione di un nuovo record, la cancellazione del record corrente e la ricerca di un programmatore in base al cognome.
Nel caso dell’inserimento di un nuovo record è da notare la tecnica del passaggio dei due argomenti unitamente al metodo AddNew. Tale tecnica verrà spiegata in dettaglio più avanti, nel commento alla routine di salvataggio dei dati della maschera nel DataBase.
Dopo la creazione del nuovo record (che diventa automaticamente il record corrente), il focus viene spostato sulla Textbox che contiene il nome per poter continuare più agevolmente l’inserimento dei dati.


Case CNUOVO
strMessaggio = "Inserisci il Cognome" & vbCrLf & "(massimo 20 caratteri)"
.AddNew "Cognome", InputBox(strMessaggio, "Inserimento nuovo programmatore")
txtCampo(CNOME).SetFocus

Nel caso della pressione del pulsante Elimina, viene richiesta conferma dell’eliminazione e, in caso positivo, il record viene eliminato attraverso il metodo Delete. Con la cancellazione, il record cancellato NON cessa di essere il record corrente; è necessario quindi spostarsi (MoveNext) dopodichè bisogna anche controllare di non aver oltrepassato i limiti del Recordset ed eventualmente provvedere.

Case CELIMINA 'Elimina il record corrente
strMessaggio = !Cognome & " " & !Nome & vbCrLf & "Confermi l'eliminazione?"
If MsgBox(strMessaggio, vbYesNo + vbExclamation, "Eliminazione record") _
= vbYes Then
.Delete
.MoveNext
If .EOF Then .MoveLast
End If

Alla pressione del pulsante Ricerca viene richiesto l’inserimento del testo da ricercare (la ricerca avviene sull’inizio del campo Cognome). Prima di iniziare la ricerca viene definito un Bookmark (ovvero un segnalibro, si usa a tale scopo la variabile bkmTemporaneo che è di tipo Variant, in accordo con quanto indicato dalla documentazione) per poter tornare al record corrente in caso di ricerca non andata a buon fine.
Ci sono da notare due cose che non emergono chiaramente dalla documentazione dell’ADO SDK, che in questo caso risulta alquanto lacunosa se non addirittura errata in certi esempi (oltre al fatto che tra i metodi dell’oggetto Recordset il Find non è nemmeno citato pur essendoci la relativa pagina di help!) e cioè:
  • il metodo Find agisce a partire dalla posizione in cui ci si trova anche se è possibile passargli una direzione ed una posizione di partenza sotto forma di Bookmark; a questo punto risulta però molto più sbrigativo, per ricerche sull’intero Recordset, muoversi sul primo record prima di iniziare la ricerca;
  • la condizione per la ricerca ha la stessa sintassi della clausola WHERE di SQL, compresi i separatori dei campi e i caratteri jolly (quindi % e _ invece di * e ? che sono quelli nativi del Jet) e comprese anche le problematiche di isolamento dei caratteri speciali come gli apici e i doppi apici che possono essere usati anche per delimitare la stringa; come in SQL quindi, la soluzione migliore per i campi stringa (non adottata nel codice per non complicare la lettura) rimane quella di sostituire ogni apice, all’interno della stringa da ricercare, con due apici consecutivi.


Case CTROVA 'Trova il primo record il cui cognome inizia con la stringa
strMessaggio = "Inserire la stringa da ricercare" & vbCrLf & _
"(la ricerca avverrà sul Cognome)"
bkmTemporaneo = .Bookmark
.MoveFirst
.Find "Cognome LIKE '" & InputBox(strMessaggio, _
"Ricerca programmatore") & "%'"
If .EOF Then 'Se non è stato trovato si torna al record precedente
MsgBox "Record non trovato!", vbExclamation, "Errore ricerca"
.Bookmark = bkmTemporaneo
End If
End Select
End With
LeggiDalDb
End Sub

Alla fine del Select Case viene chiamata la Sub LeggiDalDb() per aggiornare i controlli sulla form in base ai valori del record corrente che potrebbe essere diverso da quello precedente in caso di spostamenti o cancellazioni.
Rimane da documentare la routine di salvataggio nel DataBase dei valori contenuti dai controlli della form, operato dalla subroutine ScriviNelDb() che, come abbiamo visto, viene richiamata prima di ogni spostamento di record nel caso che il record corrente sia "dirty" ovvero modificato (variabile bolIsDirty).
Anche in tale routine si utilizza il passaggio dei valori da salvare come argomenti del metodo Update; si tratta di una caratteristica specifica degli ADO 2.0 che prevede che al metodo Update possano essere passati due argomenti: un elenco di nomi di campi da aggiornare ed un elenco dei relativi valori. I parametri sono passati sotto forma di Array utilizzando la funzione Array() che è una novità del VB6 (per la relativa documentazione vedi la guida in linea).
Prima di tutto viene costruito l’Array dei nomi dei campi che è memorizzato nella variabile varNomi (le variabili che ospitano gli Array devono essere definite come Variant).
Successivamente vengono filtrati, attraverso due variabili temporanee (datTemp di tipo Date e intTemp di tipo Integer) i due campi che non sono di tipo stringa; se i dati contenuti nelle Textbox non rispecchiano il tipo che il DataBase può accettare i valori delle Textbox non vengono assegnati alle variabili. Chiaramente questo controllo è un po’ troppo brutale e può facilmente essere migliorato.
Dopo di ciò si può costruire il secondo Array (varValori); come si può vedere gli elementi che lo compongono sono, a questo punto, di tipo diverso: alcuni sono stringhe, altri date e numeri. Da notare che l’ultimo valore dell’Array, ovvero il codice del linguaggio utilizzato, viene ricavato attraverso la succitata associazione tra indice dell’Array che contiene i codici dei linguaggi (strLinguaggi()) e la proprietà ListIndex della Combo, tale per cui ad uno stesso valore corrispondono da una parte il codice e dall’altra la descrizione del medesimo linguaggio di programmazione.
I valori nel secondo Array devono ovviamente seguire in tutto e per tutto l’ordine dei campi del primo.


Private Sub ScriviNelDb()
Dim varNomi As Variant, varValori As Variant
Dim datTemp As Date, intTemp As Integer
varNomi = Array("Cognome", "Nome", "Indirizzo", "Cap", "Citta", _
"Provincia", "Telefono", "Email", "DataNascita", "MesiAnzianita", _
"LinguaggioPrincipale")
If IsDate(txtCampo(CDATANASCITA)) Then datTemp = txtCampo(CDATANASCITA)
If IsNumeric(txtCampo(CANZIANITA)) Then intTemp = CInt(txtCampo(CANZIANITA))
varValori = Array(txtCampo(CCOGNOME), txtCampo(CNOME), txtCampo(CINDIRIZZO), _
txtCampo(CCAP), txtCampo(CCITTA), txtCampo(CPROVINCIA), txtCampo(CTELEFONO), _
txtCampo(CEMAIL), datTemp, intTemp, strLinguaggi(cmbLinguaggio.ListIndex))
rsProgrammatori.Update varNomi, varValori
blIsDirty = False
End Sub

Nella form del progetto si può trovare anche, commentato, il codice per effettuare l’aggiornamento con un Loop simile a quello della routine LeggiDalDb().
I vantaggi nell’uso dei parametri del metodo Update, al posto del loop, sono di due tipi:
  • un codice più compatto e più efficiente poiché l’accesso all’oggetto Recordset avviene una sola volta invece che ad ogni campo modificato;
  • un minore tempo di blocco del record da aggiornare, che si traduce in una minore probabilità di aggiornamenti concorrenti tra utenti diversi, che causerebbe la generazione di un errore.
Indietro (Navigare il recordset) | Indice | Avanti (L'oggetto command)



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