Oggetto
ADO (ActiveX Data Object) |
permette
l'interfacciamento ad una fonte di dati
Nota:
Non è un oggetto built-in di ASP, bensì un
oggetto ActiveX di Microsoft che interfaccia un Database tramite
un provider OLEDB.
Utilizzando
ADO è possibile eseguire le seguenti operazioni:
- Connettersi
ad un Database;
- Specificare
un comando per accedere alla fonte dati;
- Eseguire
il comando;
- Se
il comando restituisce i dati sotto forma di righe all'interno
di una tabella, memorizzare tali righe in una memoria cache
che può essere visualizzata o modificata in modo
immediato;
- Specificare
una modalità di individuazione degli errori, derivanti
in genere dall'apertura di una connessione o dall'esecuzione
di un comando.
Tutto
ciò è realizzato tramite un modello ad oggetti;
gli oggetti sono:
- Connection
- ad esso è associata la Collection Errors contente
gli oggetti Error
- Command
- ad esso è associata la Collection Parameters contente
gli oggetti Parameter
- Recordset
- ad esso è associata la Collection Fields contente
gli oggetti Field
a
questi oggetti ed all'oggetto Field è associata inoltre
la collection Properties.
Con
l'introduzione di ADO 2.0 viene integrato il concetto di eventi
nel modello di programmazione: gli eventi sono notifiche dell'avvenuto
o del prossimo completamento di una determinata operazione;
sono in genere utilizzati per coordinare in modo efficiente
un'applicazione costituita da più operazioni asincrone.
Il modello con oggetti non implementa gli eventi in modo esplicito,
ma li rappresenta come chiamate di routine del gestore degli
eventi.
I gestori degli eventi che vengono richiamati prima dell'inizio
di un'operazione consentono di esaminare o modificare i parametri
dell'operazione, quindi di annullare l'operazione o di completarla.
I gestori degli eventi che vengono richiamati dopo il completamento
di un'operazione notificano l'avvenuto completamento di un'operazione
asincrona.
Non esamineremo adesso le loro caratteristiche, rinviando
l'argomento a lezioni successive.
Esamineremo invece adesso gli oggetti, i loro metodi e le
loro proprietà ma, contrariamente a quanto fatto finora,
l'esame non sarà sistematico ed esaustivo visto il
notevole numero di questi elementi; ci limiteremo ai più
importanti ed introdurremo gli altri quando ne avremo bisogno
per particolari operazioni negli esempi applicativi.
L'accesso
da un'applicazione a una fonte dati avviene attraverso una
connessione, l'ambiente indispensabile per effettuare uno
scambio di dati.
Una transazione identifica l'inizio e la fine di una serie
di operazioni di accesso ai dati eseguite nel corso di una
connessione. ADO garantisce che tutte le modifiche apportate
a una fonte dati dalle operazioni di una transazione vengano
memorizzate oppure annullate; se si annulla la transazione
o si interrompe un'operazione la fonte dati resterà
invariata, come prima dell'inizio della transazione.
Il modello con oggetti non implementa in modo esplicito il
concetto di transazione, ma lo rappresenta tramite una serie
di metodi dell'oggetto Connection.
L'oggetto Connection consente l'accesso ad una fonte di dati
sia tramite DSN, sia tramite riferimento esplicito; in ASP
utilizzeremo ovviamente quest'ultimo metodo a meno che non
si sia anche gli amministratori del Server (Housing e applicazioni
Intranet).
Per
utilizzarlo dobbiamo prima crearne una istanza:
Set
objConn = Server.CreateObject("ADODB.Connection") |
Adesso
abbiamo accesso ai metodi ed alle proprietà dell'oggetto.
Ci limiteremo ai metodi Open, Execute e Close.
Vediamo Open e Close con un esempio.
Per motivi di sicurezza i nostri database sono in una cartella
chiamata database e non accessibile al client Internet; si
tratta di db MS Access e se vogliamo possiamo anche proteggerli
con password.
L'accesso dalle nostre pagine avviene tramite uso di functions
e subroutines contenute in un file .asp di cui facciamo l'include.
<%
Dim objConn
Dim objrs
.......
.......
Function OpenDb(nomedb,passw)
Dim Connstring
Dim Snomedb
Set objConn =
Server.CreateObject("ADODB.Connection")
Snomedb = Server.MapPath("database/" &
nomedb)
Connstring = "Driver={Microsoft Access Driver (*.mdb)};DBQ="
_
& Snomedb & ";"
If Len(Trim(passw)) > 0 Then
Connstring = Connstring & "PWD=" &
passw & ";"
End If
objConn.Open Connstring
End Function
Function CloseDb()
objConn.Close
set objConn = Nothing
End Function
.......
.......
%>
|
volendo
avremo potuto aggiungervi anche la gestione errori e porre
se OK, altrimenti
Naturalmente
se pippo1.mdb non ha password scriveremo:
Da
notare set objConn = Nothing; questa assegnazione rilascia
l'oggetto e libera quindi le risorse relative impegnate dal
server; ricordatevelo sempre, eviterete di essere prima o
poi scaricati per mancanza di risorse del server!
Non credo vi siano bisogno di altri commenti all'esempio,
semmai di una considerazione pratica: è meglio che
i nostri database siano in Access 97 piuttosto che in Access
2000 se non siamo sicuri del livello di Access supportato
dal nostro provider Internet.
Vediamo
adesso il metodo Execute: può essere utilizzato
in due forme a secondo che restituisca o meno un recordset.
Qualora Execute restituisca un recordset questo sarà
sempre del tipo read-only forward-only.
Sintassi:
objconnection.Execute
CommandText[, RecordsAffected[, CommandType]]
Set objrecordset = objconnection.Execute(CommandText[,
RecordsAffected[, CommandType]]) |
CommandText:
il comando da eseguire;
RecordsAffected (opzionale): variant Long in cui il
provider restituisce il numero dei record interessati;
CommandType (opzionale): indica al provider come valutare
CommandText.
I valori possibili sono:
Costante
|
Significato
|
adCmdText |
definizione
testuale del comando (SQL standard); |
adCmdTable |
nome
di una Tabella; |
adCmdStoredProc |
Stored
Procedure; |
adCmdUnknown |
tipo
non conosciuto (default). |
Noi
useremo sempre l'opzione 1, ma potremo anche non specificarla;
in questo caso l'esecuzione sarà un po' più
lenta (il provider OLEDB deve determinare lui di che tipo
si tratta).
L'oggetto
Command è la definizione di uno specifico comando da
eseguire sulla fonte dei dati.
Abbiamo già visto come sia possibile eseguire un comando
con il metodo Execute dell'oggetto Connection; pertanto l'oggetto
Command verrà usato se avremo bisogno di ripetute esecuzioni
del commando o se avremo da utilizzare Stored Procedure (query
con parametri).
Inoltre utilizzando la proprietà Name è possibile
eseguirlo come metodo dell'oggetto Connection associato.
<%
Dim objConn
Dim objCmd
Dim objRs
Dim Connstring
Dim Snomedb
Set objConn =
Server.CreateObject("ADODB.Connection")
Snomedb = Server.MapPath("database/pippo1.mdb")
Connstring = "Driver={Microsoft Access Driver (*.mdb)};DBQ="
_
& Snomedb & ";"
objConn.Open Connstring
Set objCmd = Server.CreateObject("ADODB.Command")
objCmd.ActiveConnection = objConn
objCmd.CommandText = "SELECT * FROM Tabella1 WHERE
Sesso='M'" _
& " ORDER BY Cognome, Nome"
objCmd.CommandType = 1
objCmd.Name = "Maschi"
Set objRs = objConn.Maschi
.......
.......
%>
|
Metodi:
Execute, CreateParameter
Proprietà: ActiveConnection, CommandText, CommandTimeout,
CommandType, Name
Il
metodo Execute ha la stessa sintassi di quello dell'oggetto
Connection; da notare che i parametri del metodo possono anche
essere impostati come proprietà dell'oggetto prima
di richiamare il metodo.
Nell'esempio precedente al posto delle 2 ultime istruzioni
avremmo potuto scrivere:
Set objRs = objCmd.Execute |
Inoltre
è possibile passare un oggetto Command alla proprietà
Source del metodo Open di un recordset.
Nell'esempio abbiamo prima aperto una connessione; avremmo
potuto non farlo ponendo ActiveConnection ad una stringa di
connessione valida. In questo caso ADO crea comunque un'oggetto
Connection, ma non lo associa ad alcuna variabile; è
necessario creare un oggetto Connection se abbiamo più
oggetti Command e/o Recordset da associare a quella connessione.
NOTA:
Qualora non abbiate familiarità con la sintassi
SQL vi consiglio di consultare la Lezione 2 del mio corso
di Database.
|