Interazione con i database
VB è nato principalmente per la creazione di potenti interfacce che permettono la gestione locale o via rete (NON Internet) di dati residenti su una fonte di dati quale un database. Essendo un prodotto di casa Microsoft, VB preferisce lavorare con prodotti (DBMS, ovvero gestori di database) Microsoft come Access e SQL Server, ma lavora correttamente anche con DBMS di case differenti come Oracle.
In questo capitolo ci baseremo sull'interazione con Access, preferibilmente versione 2000 e do per scontato che il lettore abbia almeno un'infarinatura di base di SQL.
Per la connessione con una fonte di dati e la gestione dei dati ivi residenti, VB utilizza l'oggetto ADO (ActiveX Data Object) per l'interfacciamento tra il programma e la fonte di dati stessa. ADO mette a disposizione, tra l'altro, due oggetti fantastici, ovvero Connection per la gestione della connessione ed altre utility, e Recordset per la gestione fisica dei dati.
Si crei un nuovo EXE standard e si acceda al menu
Progetto / Riferimenti...per l'importazione dei riferimenti ad ADO, selezionando le voci come nell'immagine seguente:


File / Salva progetto con nome...nella cartella test da creare sotto il drive C:
C:\testAll'interno di questa cartella troverete fei file di progetto creati automaticamente da VB; aggiungete in questa cartella il file Access database.mdb al cui interno creare la tabella utenti in cui inserire i campi id (Contatore), nome (Testo) e cognome (Testo); appena espletata questa operazione tornare sulla Form in visualizzazione struttura, accedere al codice della Form ed inserire queste righe nella parte generale:
Option Explicit Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim stringa As StringI tipi di dato ADODB.Connection ed ADODB.Recordset sono stati aggiunti a VB per mezzo dell'importazione dei riferimenti come accennato in precedenza.
Doppio click sul CommandButto per accedere alla Sub in cui inserire il seguente codice:
Private Sub cmdInserisci_Click()
If Len(Trim(txtNome.Text)) = 0 Then
MsgBox "Inserire il nome", vbCritical, "ERRORE"
txtNome.SetFocus
Exit Sub
End If
If Len(Trim(txtCognome.Text)) = 0 Then
MsgBox "Inserire il cognome", vbCritical, "ERRORE"
txtCognome.SetFocus
Exit Sub
End If
stringa = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
stringa = stringa & "C:\test\database.mdb"
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
cn.Open stringa
rs.Open "utenti", cn, 3, 3
rs.AddNew
rs("nome") = txtNome.Text
rs("cognome") = txtCognome.Text
rs.Update
Set cn = Nothing
Set rs = Nothing
MsgBox "Inserimento effettuato", vbOKOnly, "CONFERMA"
End Sub
A prima vista questo codice potrebbe destare qualche perplessità al lettore più inesperto, quindi affrontiamo le singole fasi della Sub.
Controllo che i campi nome e cognome siano stati compilati correttamente, utilizzando l'espressione Exit Sub per uscire dalla Sub qualora le condizioni non siano state soddisfatte e non si vuol permettere la continuazione della routine:
If Len(Trim(txtNome.Text)) = 0 Then
MsgBox "Inserire il nome", vbCritical, "ERRORE"
txtNome.SetFocus
Exit Sub
End If
If Len(Trim(txtCognome.Text)) = 0 Then
MsgBox "Inserire il cognome", vbCritical, "ERRORE"
txtCognome.SetFocus
Exit Sub
End If
A condizioni soddisfatte creo la stringa di connessione al database e la memorizzo nella variabile stringa:
stringa = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" stringa = stringa & "C:\test\database.mdb"Con la clausola Set imposto le variabili cn ed rs come nuove istanze degli oggetti Connection e Recordset:
Set cn = New ADODB.Connection Set rs = New ADODB.RecordsetApro la connessione al database ed il Recordset in modalità scrittura, passando al metodo Open il nome della tabella su cui voglio lavorare, il nome della connessione che sto utilizzando ed i cursori appropriati:
cn.Open stringa rs.Open "utenti", cn, 3, 3Utilizzo i metodi AddNew ed Update per aggiungere un nuovo record alla tabella e per aggiornarlo; passo poi al Recordset i campi della tabella e li valorizzo con le variabili contenenti i dati corrispondenti:
rs.AddNew
rs("nome") = txtNome.Text
rs("cognome") = txtCognome.Text
rs.Update
Pulisco la memoria del buffer dalle variabili contenenti la connessione ed il recordset, settandole sul valore speciale di VB Nothing:
Set cn = Nothing Set rs = NothingIn fine, ad operazioni espletate, lancio un messaggio di conferma:
MsgBox "Inserimento effettuato", vbOKOnly, "CONFERMA"Vediamo adesso come leggere i dati dal database. Si aggiunga una nuova Form dal menu
Progetto / Inserisci formsi scelga Form e si confermi. Si assegni alla Form il nome frmLettura e si aggiunga una Label di nome lblDati grande quanto tutta la Form.
Si acceda all'evento Form_Load() della Form con un doppio click in un punto qualsiasi della Form stessa e si inserisca nella parte generale il seguente codice:
Option Explicit Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim stringa As StringIn Form_Load(), invece, inserire il seguente codice:
Private Sub Form_Load()
stringa = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
stringa = stringa & "C:\test\database.mdb"
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
cn.Open stringa
rs.Open "SELECT * FROM utenti", cn, 1
If rs.EOF Then
lblDati.Caption = "Nessun dato"
Else
While rs.EOF = False
lblDati.Caption = lblDati.Caption _
& rs("nome") & " " _
& rs("cognome") & vbCrLf
rs.MoveNext
Wend
End If
Set cn = Nothing
Set rs = Nothing
End Sub
Gran parte del codice appena presentato non è molto differente da quello di esempio per l'inserimento: la stringa di connessione al database è la stessa, è necessario settare ed aprire, ed in fine svuotare, gli oggetti Connection e Recordset. Concentriamoci sulla lettura dei dati:
If rs.EOF Then
lblDati.Caption = "Nessun dato"
Else
While rs.EOF = False
lblDati.Caption = lblDati.Caption _
& rs("nome") & " " _
& rs("cognome") & vbCrLf
rs.MoveNext
Wend
End If
La logica seguita è la seguente: se non ci sono dati nella tabella, ovvero se la lettura del Recordset arriva alla fine della tabella (EOF - End Of File) lancio un messaggio che avvisa che non sono stati trovati dati; altrimenti effettuo un ciclo e stampo a video nella Label tutti i record tirati fuori dalla stringa SQL
SELECT * FROM utentipassata al Recordset impostato in lettura.
- << Lezione Precedente
- Indice Guida
- Lezione Successiva >>







