Sei in: Per i Webmaster - Corso di ASP - Oggetto Recordset
Come per l'oggetto Connection, anche l'oggetto Recordset deve
essere istanziato prima di poter essere utilizzato e le istruzioni sono
molto simili:
Dim objRs
Set objRs =
Server.CreateObject("ADODB.Recordset")
La variabile objRs contiene
l'oggetto ma non è sufficiente l'istanza per inserire dati nell'oggetto,
bisogna utilizzare il metodo Open, la cui forma generale è la
seguente:
objRs.Open source, connection, cursortype, locktype,
commandtype
source è o un oggetto Command che vedremo più
avanti o una stringa che contiene le informazioni relative alla
connessione
connection è o un oggetto Connection o una stringa
contenente le informazioni relative alla connessione
cursortype
indica in che modo ci si potrà spostare all'interno del
recordset
locktype determina in che modo sarà possibile, se lo
sarà, scrivere nel database
commandtype indica come dovrà essere
interpretato il parametro source
Per quanto riguarda il valore che
potranno avere i parametri cursortype, locktype e commandtype, bisogna
fare riferimento a delle costanti, le costanti ADO che sono tutte
raccolte in un file particolare che di norma si trova nella cartella
C:\Programmi\File Comuni\System\ado e il cui nome è
adovbs.inc.
Seguono tre tabelle che riassumono i valori
delle costanti ADO che interessano i parametri del metodo Open
dell'oggetto Recordset.
CursorType
| Nome | Valore | Descrizione |
| adOpenDynamic | 2 | Apre un cursore dinamico |
| adOpenForwardOnly | 0 | Default. Apre un cursore "solo in avanti" |
| adOpenKeyset | 1 | Apre un cursore di tipo keyset |
| adOpenStatic | 3 | Apre un cursore di tipo statico |
| adOpenUnspecified | -1 | Indica un valore non specificato per il tipo di cursore |
LockType
| Nome | Valore | Descrizione |
| adLockBatchOptimistic | 4 | I record non vengono bloccati finché non avviene un aggiornamento batch. Questa opzione dovrà essere utilizzata con cursori lato client e Recordset non connessi |
| adLockOptimistic | 3 | I record sono bloccati solo quando si chiama il metodo update |
| adLockPessimistic | 2 | I record sono bloccati immediatamente quando inizia la modifica per garantire che non vi siano discrepanze fra quando i nuovi valori sono stati inseriti e quando si verifica il comando Update |
| adLockReadOnly | 1 | Default. I record sono di sola lettura e non possono essere modificati. Inoltre, non si possono aggiungere nuovi record |
| adLockUnspecified | -1 | La copia dei dati viene creata con lo stesso tipo di bloccaggio dell'originale |
CommandType
| Nome | Valore | Descrizione |
| adCmdFile | 256 | Il provider interpreta il comando (source) come un file precedentemente salvato |
| adCmdStoredProc | 4 | Il provider interpreta il comando (source) come una store procedure |
| adCmdTable | 2 | Il provider genera una query SQL che ritorna tutti i record della tabella indicata dal comando (source) |
| adCmdTableDirect | 512 | Il provider ritorna tutti i record della tabella indicata dal comando (source) |
| adCmdText | 1 | Il provider interpreta il comando (source) come una definizione testuale di una istruzione, ad esempio una istruzione SQL |
| adCmdUnknown | 8 | Il tipo di istruzione nel comando (source) non è conosciuto |
| adCmdUnspecified | -1 | Il tipo di comando non è specificato |
Vi sono vari modi per utilizzare un Recordset, ad esempio
utilizzando delle connessioni implicite che però potrebbero risultare
difficili da interpretare nel caso di modifiche da apportare al codice a
distanza di tempo o nel caso di lavori di equipe. Solitamente si
preferisce aprire esplicitamente la connessione e utilizzare l'oggetto
Recordset impostando tutti i parametri richiesti, anche quelli di
default.
Per poter utilizzare queste costanti, si può agire
importando il file adovbs.inc nel proprio sito e facendo l'inclusione di
tale file nelle pagine che avranno bisogno delle costanti stesse oppure
dichiarando, in un file da includere o all'interno delle pagine
interessate, solo le costanti di cui si pensa di avere bisogno. Si
sconsiglia vivamente l'utilizzo diretto dei numeri nella istruzione che
apre il recordset, se non altro per una maggior chiarezza del codice.
Leggere i dati di un database
Vediamo quindi
qualche esempio di utilizzo dell'oggetto Recordset. Ipotizziamo di avere
un database Access contenente una tabella Utenti con i campi Nome e
Cognome, di volerne leggere il contenuto e di riportarlo a video. Quella
che segue è una delle possibili sintassi:
<!--#include
file="percorso/adovbs.inc"-->
<%
Dim path, objCon, objRs, strSql
path = "percorso\nomefile.mdb"
Set objCon = Server.CreateObject("ADODB.Connection")
objCon.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" &
server.MapPath(path)
Set objRs = Server.CreateObject("ADODB.Recordset")
strSql = "SELECT * FROM Utenti"
objRs.Open strSql, objCon, adOpenForwardOnly, adLockReadOnly,
adCmdText
Do While Not objRs.EOF
Response.Write objRs("Nome") & " " & objRs("Cognome") &
"<br>"
objRs.Movenext
Loop
objRs.Close
Set objRs = Nothing
objCon.Close
Set objCon = Nothing
%>
Dopo aver incluso il file contenente le costanti ADO, si
dichiarano le variabili necessarie. Si apre la connessione, in questo caso
sfruttando il metodo MapPath dell'oggetto Server per ricavare il percorso
assoluto del database, si apre il recordset e si crea un ciclo che
arriverà fino alla fine del recordset (EOF = End Of File - riga 10)
prendendo in esame un record alla volta grazie al metodo Movenext. Alla
fine del ciclo, quando ormai il recordset è stato utilizzato e la
connessione non è più necessaria, è bene chiudere entrambi gli oggetti e
ripulire la memoria del server (linee 13, 14, 15 e 16).
Una
alternativa potrebbe essere quella di impostare le proprietà del recordset
una per una e poi di aprire l'oggetto con l'istruzione open, ovvero:
<!--#include
file="percorso/adovbs.inc"-->
<%
Dim path, objCon, objRs, strSql
path = "percorso\nomefile.mdb"
Set objCon = Server.CreateObject("ADODB.Connection")
objCon.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" &
server.MapPath(path)
Set objRs = Server.CreateObject("ADODB.Recordset")
strSql = "SELECT * FROM Utenti"
objRs.Source = strSql
objRs.ActiveConnection = objCon
objRs.CursorType
= adOpenForwardOnly
objRs.LockType =
adLockReadOnly
objRs.Open
,,,,adCmdText
Do While Not objRs.EOF
Response.Write objRs("Nome") & " " & objRs("Cognome") &
"<br>"
objRs.Movenext
Loop
objRs.Close
Set objRs = Nothing
objCon.Close
Set objCon = Nothing
%>
In questo caso i primi quattro parametri necessari al metodo open sono dichiarati esplicitamente, l'ultimo, cioè il tipo di comando, viene invece passato come parametro, non prima però di aver aggiunto le virgole necessarie al metodo open per capire che si tratta dell'ultimo parametro (objRso.Open ,,,,adCmdText).
Fino ad ora abbiamo visto come leggere dei dati da un database; ma quali altre operazioni sono possibili su un archivio dati? Sono tre e precisamente inserimento di nuovi record, modifica di record esistenti e cancellazione di record esistenti. Nonostante queste operazioni siano fattibili anche tramite l'oggetto recordset, si preferisce l'utilizzo di un nuovo oggetto, esplicitamente creato per questo tipo di operazioni, ovvero l'oggetto Command, che vediamo nella prossima sezione.
