Appunti su ADO
Alessandro Benedetti
ITIS “E. Divini” San Severino Marche (MC)
APPUNTI SU ADO (ACTIVEX DATA OBJECTS)
Introduzione
ADO (Activex Data Object) è il sistema di accesso a database che noi utilizzeremo in ambiente
Microsoft, sia da Visual Basic sia da pagine ASP.
Activex è un file con estensione OCX che può essere incorporato in un programma inserendolo in
una finestra di dialogo, impostandone le proprietà e aggiungendo il codice dell’evento. È simile a
una DDL (Dinamic Linked Library): si collega al programma in modo dinamico.
Cenni di storia: In passato l’accesso di programmi ai database era complicato. Per ciascun database
usato era necessario conoscere la relativa API (Application Programming Interface) a basso livello.
La necessità di uno standard fu affrontata con ODBC (Open DataBase Connectivity), che
proponeva la realizzazione di una API universale. La nuova impostazione che supera i limiti di
ODBC è OLEDB (Object Linking & Embedding DataBase), che rappresenta uno sviluppo della
tecnologia più generale che Microsoft sta portando avanti: la tecnologia COM (Component Object
Model).
ADO fa parte del progetto Microsoft più generale Universal Data Access (UDA) e rappresenta
l’evoluzione e il superamento di alcuni limiti di precedenti modalità di accesso ai database come
Data Access Objects (DAO) e Remote Data Objects (RDO).
N.B. Per applicazioni Visual Basic che usano la libreria ADO è necessario inserire il riferimento
Microsoft ActiveX Data Objects 2.1 Library del menu Strumenti | Riferimenti di Visual Basic
Gerarchia di accesso ai dati
Applicazione Visual Basic, C++, ASP, …
ADO
OLEDB
ODBC
ACCES
SQL
Altri provider
di dati
Nel seguito degli appunti si descriverà sommariamente l’architettura di ADO, in riferimento a una
piattaforma di sviluppo Microsoft Visual Basic 6.
In un’altra dispensa si riprenderanno le tecniche di programmazione in ambiente di sviluppo ASP.
Infine in appendice si riassumono schematicamente le caratteristiche di ADO.
9 Gen. 2007
pag. 1/7
Appunti su ADO
Alessandro Benedetti
ITIS “E. Divini” San Severino Marche (MC)
Il modello a oggetti ADO
Il modello a aggetti ADO è costituito da un insieme di oggetti programmabili che supporta COM
(Component Object Model) e OLE Automation al fine di utilizzare la potente tecnologia OLEDB.
Nel modello ADO sono disponibili sette oggetti, organizzati in modo debolmente gerarchico.
Nella figura seguente sono rappresentati due schemi. In bianco le collezioni e in grigio gli oggetti.
Oggetto Connection
Questo oggetto gestisce le informazioni sulla connessione, ad esempio il tipo di cursore, la stringa
di connessione, il time out della query, il time out della connessione, il database predefinito.
Tra i diversi modi di aprire una connessione preferiamo quello indicato nei passaggi seguenti:
1. Dichiarare un oggetto connessione;
2. Istanziarlo
3. Dichiarare una stringa
4. Inserire nella stringa l‘elenco dei parametri necessari con i rispettivi valori
5. Aprire la connessione
Ecco il codice di esempio per una connessione Visual Basic:
Dim conn As ADODB.Connection ‘Dichiarare un oggetto Connection
Set conn = New ADODB.Connection ‘ Istanziare l’oggetto
Dim strConn As String ‘ Dichiarare una stringa per la connessione
‘ Definire la stringa di connessione
StrConn = “Provider = Microsoft.Jet.OLEDB.4.0;” & _
“Data Source = C:\<Path del DB>\<Nome del DB>”
conn.Open strConn ‘ Aprire la connessione
9 Gen. 2007
pag. 2/7
Appunti su ADO
Alessandro Benedetti
ITIS “E. Divini” San Severino Marche (MC)
Oggetto Recordset
È un gruppo di righe di una tabella o restituite da una query con il relativo cursore. È possibile
aprire un oggetto Recordset, senza aprire esplicitamente un oggetto Connection. Creando un getto
Connection, si potranno tuttavia aprire più Recordset nella stessa connessione.
Le principali proprietà, metodi, cursori, bloccaggi e opzioni sono in appendice.
Aprire un Recordset
Un recordset può essere aperto usando tre metodi:
• il metodo Execute dell’oggetto Connection
• il metodo Execute dell’oggetto Command
• il metodo Open dell’oggetto Recordset.
Preferiamo usare il terzo metodo con la sintassi:
rs.Open [Source, [ActiveConnection, [CursorType, [LockType, [Options]]]]]
Esempio: supponendo aperta la connessione conn e definendo come sorgente la tabella AnagDip, si
ha la sequenza:
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.CursorType = adOpenKeyset ‘ vedere tabella Tipi di cursore
rs.LockType = adLockOptimistic ‘ vedere tabella Tipi di bloccaggio
rs.Open “AnagDip”, conn,,,adCmdTable ‘ vedere tabella Opzioni
Chiudere di un Recordset
rs.Close
Set rs = Nothing
Navigare su un Recordset
Sequenza per andare avanti:
Private Sub CmdProssimo_Click()
rs.MoveNext
If rs.EOF Then
rs.MovePrevious
End If
MostraCampi ‘ procedura di visualizzazione dei campi nel form
End Sub
Sequenza per tornare indietro:
Private Sub CmdPrecedente_Click()
rs.MovePrevious
If rs.BOF Then
rs.MoveNext
End If
MostraCampi‘ procedura di visualizzazione dei campi nel form
Oggetto Field
Contiene informazioni su una singola colonna di dati di un Recordset. L’oggetto Recordset utilizza
la collezione Fields per raggruppare tutti gli oggetti Field ad esso correlati. Le informazioni
dell’oggetto Field includono il tipo di dati, la precisione e la scala numerica.
Le principali proprietà dell’oggetto Field. sono elencate in appendice.
9 Gen. 2007
pag. 3/7
Appunti su ADO
Alessandro Benedetti
ITIS “E. Divini” San Severino Marche (MC)
Accesso ai campi di un record
Un campo può essere indicato usando il nome del campo oppure il numero della colonna. Esempi:
rs.Fields(“Cognome”).Value = ”Rossi”
rs.Fields(“Cognome”) = “Rossi” ‘ equivalente alla precedente
MyString = rs.Fields(2) ‘ Assegna alla stringa MyString il valore
‘ della seconda colonna
Un altro modo di indicare un campo di un recordset consiste nell’uso del punto esclamativo ! (in
inglese: bang). Esempio:
rs!Cognome = ”Rossi”
Aggiungere un record ad un Recordset
1. Usare il metodo AddNew per aggiungere una nuova riga. Tutti i campi saranno impostati ai
valori di default
2. Riempire i campi secondo la necessità e i vincoli
3. Usare il metodo Update per salvare la nuova riga. Il nuovo record diventa il record corrente.
Esempio:
With rs
.AddNew
.Fields("Cognome") = "Rossi"
.Fields("Nome") = "Mario"
.Update
End With
Cancellare un record in un Recordset
1. Muoversi alla riga interessata
2. Usare il metodo Delete per eliminarla
N.B. Dopo che un record è stato cancellato rimane ancora il record corrente, il precedente rimane il
precedente e il successivo rimane il successivo. Così bisogna usare il metodo MoveNext ammesso
che il record cancellato non sia l’ultimo, perché in tal caso si verificherebbe un errore. Pertanto è
necessario gestire ogni situazione.
Esempio: Si eliminano tutte le righe di una tabella:
Public Sub EliminaTabella(strTable As String)
With rs
If .RecordCount > 0 Then
.MoveFirst
Do
.Delete
' Senza il seguente MoveNext, ADO continuerebbe
' ad eliminare sempre la stessa prima riga.
.MoveNext
Loop Until .EOF
End If
End With
End Sub
Modificare un campo di una riga di un Recordset
1. Spostarsi sul record interessato
2. Effettuare le modifiche
3. Aggiornare il record con il metodo Update
Esempio:
9 Gen. 2007
pag. 4/7
Appunti su ADO
Alessandro Benedetti
ITIS “E. Divini” San Severino Marche (MC)
Public Sub ModificaRiga()
With rs
.Find "[Titolo] = 'Boss'"
If .EOF Then
MsgBox "Nessun record trovato!"
Else
.Fields("Titolo") = "Capo"
.Update
End If
End With
End Sub
Oggetto Command
Gestisce le informazioni su un comando, ad esempio una stringa di query, le definizioni di un
parametro e così via. È possibile eseguire una stringa di comando su un oggetto Connection di una
stringa di query all’apertura di un oggetto Recordset, senza definire un oggetto Command.
L’oggetto Command è utile per definire i parametri di una query o eseguire una stored procedure
che restituisce parametri di output. L’oggetto Command supporta una serie di proprietà che
descrivono il tipo e lo scopo della query e consentono ad ADO di ottimizzare l’operazione.
Oggetto Error
Contiene informazioni di errore estese relativamente alle condizioni di errore causate dal provider
di dati. Poiché una singola istruzione può generare più errori, la collezione Errors può contenere più
oggetti Error contemporaneamente.
Oggetto Parameter
Un singolo parametro associato all’oggetto Command. L’oggetto Command utilizza la collezione
Paramenters per raggruppare oggetti Parameter ad esso correlati. Gli oggetti Parameter possono
essere creati automaticamente inviando query ad database. Tuttavia è possibile creare questo
insieme anche tramite programma per migliorare le prestazioni durante l’esecuzione.
Oggetto Property
È una caratteristica definita dal provider per un oggetto ADO. Gli oggetti ADO presentano due tipi
di proprietà: incorporate e dinamiche. Le proprietà incorporate sono implementate in ADO e
disponibili per ogni nuovo oggetto ADO. Le proprietà dinamiche sono definite da un provider di
dati sottostante e fanno parte dell’insieme di Properties del rispettivo oggetto ADO. Una proprietà
può, ad esempio indicare se un oggetto Recordset supporta le transazioni o l’aggiornamento. Si
tratta di una delle funzioni più potenti di ADO poiché consente al provider di servizi di ADO di
fornire interfacce speciali.
9 Gen. 2007
pag. 5/7
Appunti su ADO
Alessandro Benedetti
ITIS “E. Divini” San Severino Marche (MC)
Appendice
Principali proprietà dell’oggetto Recordset
BOF
Bookmark
CursorType
EOF
Filter =
<condizione>
LockType
Sort = <campo>
Source
Indica se la posizione del record corrente è forzata a posizionarsi prima del
primo record
Imposta o restituisce un segnalibro che identifica univocamente il record
corrente, o imposta come record corrente un record identificato da un
segnalibro valido
Imposta o restituisce il tipo di cursore usato in un recordset.
Indica se la posizione del record corrente è forzata a posizionarsi dopo
l’ultimo record.
Permette di estrarre le righe del recordset che rispondono alla condizione
argomento della proprietà
Imposta o restituisce il tipo di blocco imposto sul record durante l’editing.
Ordina il recordset secondo il campo indicato nella proprietà
Imposta o restituisce la sorgente (nome della tabella o oggetto command)
del recordset
Principali metodi dell’oggetto Recordset
AddNew
Close
Delete
Find
Move
MoveFirst
MoveLast
MoveNext
MovePrevious
Open
Update
UpdateBatch
Crea un nuovo record per un recordset aggiornabile
Chiude un recordset aperto, con tutti gli oggetti dipendenti
Cancella il record corrente .
Trova il prossimo record che incontra una condizione
Muove la posizione del record corrente in un oggetto Recordset
Cursore sul primo record
Cursore sull’ultimo record
Cursore sul prossimo record
Cursore sul record precedente
Apre un cursore su un recordset
Salva ogni cambiamento effettuato sul record corrente
Scrive tutti gli aggiornamenti batch pendenti sul disco
Tipi di cursore dell’oggetto Recordset
Valore numerico Costante simbolica
1 (default)
adOpenForwardOnly
2
adOpenKeyset
3
adOpenDynamic
4
adOpenStatic
9 Gen. 2007
Descrizione
Cursore utilizzato per visualizzare i dati; consente
movimenti solo in avanti: è il più veloce dei cursori
Consente tutti i movimenti sui record; non visualizza i
record aggiunti dagli altri utenti
Consente tutti i movimenti; gli inserimenti e gli
aggiornamenti sono visibili agli utenti; è il più lento dei
cursori
Cursore statico utilizzato per visualizzare i dati. Non
consente manipolazione per gli utenti finali
pag. 6/7
Appunti su ADO
Alessandro Benedetti
ITIS “E. Divini” San Severino Marche (MC)
Tipi di bloccaggio dell’oggetto Recordset
Valore
numerico
1 (default)
2
3
4
Costante simbolica
Descrizione
adLockReadOnly
La tabella è bloccata in sola lettura; non si possono
modificare i record
adLockPessimistic
Il gestore dei dati assicura che le operazioni di
aggiornamento dei dati si concludano correttamente,
bloccando i record ad uno ad uno per tutta la durata
delle operazioni di modifica
adLockOptimistic
Blocca i record uno ad uno solo quando viene attivato
il metodo Update
adLockBatchOptimistic Come il precedente, ma riferito ad operazioni di
aggiornamento in modalità batch
Opzioni per Recordset
Valore numerico Opzione
adCmdText
1
2
adCmdTable
512
adCmdTableDirect
4
adCmdStoredProc
8
adCmdUnknown
256
adCmdFile
Descrizione
Dice al provider di valutare la sorgente come
istruzione SQL
Dice ad ADO di generare una query SQL per
trovare tutte le righe dalla tabella o query il cui
nome è specificato nella sorgente
Dice al provider di restituire tutti i record della
tabella o query il cui nome è specificato nella
sorgente
Dice al provider di valutare la sorgente come stored
procedure o query
Dice ad ADO di interrogare il provider per
determinare se la sorgente è una stored procedure, il
nome di una tabella o un’istruzione SQL
Dice ad ADO che il parametro sorgente è il nome di
un file contenente un recordset
Principali proprietà della collezione Fields
Proprietà
Count
Name
Value
Attributes
9 Gen. 2007
Descrizione
Indica il numero di campi nel record dell’oggetto recordset
Imposta o restituisce il nome del campo
Imposta o restituisce il contenuto del campo (default)
Indica una o più caratteristiche
pag. 7/7