Oggetto
ADO (ActiveX Data Object): l'oggetto Recordset |
L'oggetto
Recordset rappresenta l'intero insieme di record o
di una Table o risultanti dall'esecuzione di un comando query;
referenzia sempre ad un solo record dell'insieme, il record
corrente.
Delle numerose proprietà e metodi esamineremo solo
quelle di uso più frequente.
Per
utilizzarlo dobbiamo prima crearne una istanza:
Set objRs = Server.CreateObject("ADODB.Recordset") |
Adesso
abbiamo accesso ai metodi ed alle proprietà dell'oggetto.
Metodi
|
Proprietà
|
Open |
ActiveConnection |
Requery |
Source |
Close |
CursorLocation |
AddNew |
CursorType |
Delete |
LockType |
Update |
CacheSize |
CancelUpdate |
MaxRecords |
MoveFirst |
Filter |
MoveLast |
BOF |
MoveNext |
EOF |
MovePrevious |
RecordCount |
Di
questi metodi e proprietà alcuni ci sono già
noti in quanto li usiamo tutti i giorni nei programmi in Visual
Basic, pertanto vedremo solo quelli nuovi o che hanno una
sintassi particolare.
Vediamo per primi Open e Close con un esempio.
Andiamo ad aggiungerli alle functions e subroutines contenute
in un file .asp di cui facciamo l'include della lezione precedente.
<%
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 OpenRs(mysql,update)
'update = True|False
Set objRs = Server.CreateObject("ADODB.Recordset")
If update Then
objRs.LockType = 2 ' adLockPessimistic
Else
objRs.LockType = 1 ' adLockReadOnly
End If
objRs.Open mysql,objConn,2,,1
End Function
Function CloseDb()
objConn.Close
set objConn = Nothing
End Function
Function CloseRs()
objRs.Close
set objRs = Nothing
End Function
.......
.......
%>
|
La
sintassi di Open è la sequente:
ojbrecordset.Open
Source,ActiveConnection,CursorType,LockType,Options |
Dei
parametri del metodo solo l'ultimo non è anche una
proprietà.
Source - generalmente o il nome di una Table o una stringa
SQL.
ActiveConnection - un oggetto Connection aperto od
una stringa di connessione valida; in quest'ultimo caso vale
quanto già detto per l'oggetto Command.
CursorType:
Valore
|
Costante
|
0 |
adOpenForwardOnly |
1 |
adOpenKeyset |
2 |
adOpenDynamic |
3 |
adOpenStatic |
LookType:
Valore
|
Costante
|
1 |
adLookReadOnly |
2 |
adLookPessimistic
- il record viene bloccato all'atto dell'edit |
3 |
adLookOptimistic
- il record viene bloccato solo all'atto dell'update |
Options:
equivale al CommandType già visto
Il
metodo Open è necessario in tutti quei casi in cui
non ci basta un recordset Forward-only e Read-only; apre in
pratica un cursore e questo è il parametro (o proprietà)
più importante.
Dei cursori possibili tutti, tranne il primo, consentono libertà
di navigazione, ma hanno diverso comportamento: il cursore
dinamico riflette la situazione dei record in tempo reale,
quello statico da una visione congelata all'atto della Open,
il Keyset non visualizza i nuovi record aggiunti da altri
utenti ma solo le cancellazioni e le variazioni; ovviamente
l'utilizzo di risorse è tanto maggiore quanto maggiore
è la dinamicità.
Il
metodo Requery riesegue la query sorgente del recordset;
ha ovviamente senso solo per cursori diversi da Dinamic.
Da tenere presente che il comportamento di AddNew e
dell'editing del record corrente è lo stesso: il movimento
ad altro record forza l'esecuzione del metodo Update;
per eliminare le variazioni pendenti eseguire CancelUpdate
prima dello spostamento.
Delle
proprietà esaminiamo solo CacheSize, Filter e MaxRecords;
le altre o le abbiamo già esaminate o sono ovvie.
CacheSize indica il numero di record (default = 1)
da leggere ogni volta dal database e trasferire nella memoria
locale; è utile per velocizzare l'esecuzione ma aggiornamenti
eseguiti da altri utenti non provocano l'aggiornamento della
memoria cache.
L'aggiornamento può essere forzato con il metodo Resync,
ma ciò può generare errori che vanno gestiti;
pertanto l'utilizzo della cache è tranquillo solo con
cursore statico.
Filter applica un filtro al recordset aperto; può
essere o una stringa contente la condizione o una delle costanti
adFilterGroupEnum; di quest'ultime ci interessa solo adFilterNone
(=0), che rimuove il filtro ripristinando così la vista
dell'intero recordset.
La stringa è dello stesso tipo che useremmo in una
clausola WHERE di una SQL; a questo proposito riteniamo utile
precisare che il delimitatore di stringa da utilizzare nel
linguaggio SQL è ' e non " (nella RecordSource
in Visul Basic funzionava anche il secondo, ma qui è
meglio attenersi agli standard SQL): "Campo1 = 'Pippo'
AND (Campo2 = 'Pluto' OR Campo3 = 2)" è una forma
corretta.
MaxRecords indica il numero di record (default=0, l'intero
recordset) da trasferire nel recordset; richiede ovviamente
meno risorse, ma si utilizza solo in casi particolari (ad
esempio ci sono sufficienti solo un certo numero di risultati
di una query di interrogazione).
NOTA:
Tenere presente che quasi tutte le Proprietà diventano
read-only dopo l'esecuzione del metodo Open e tali restano
fino all'esecuzione del metodo Close.
Oggetto
Recordset: Collection Fields |
All'oggetto
Recordset è associato l'insieme Fields, ovvero
i campi del record.
L'accesso ai singoli oggetti Field può avvenire o tramite
indice:
objRecordset.Fields(I)
- con I da 0 a objRecordset.Fields.Count-1 |
o
tramite il nome:
objRecordset.Fields("nomecampo") |
Le
Proprietà dell'oggetto Field sono:
Proprietà
|
Name |
ActualSize |
DefinedSize |
Type |
Precision |
NumericScale |
OriginalValue |
UnderlyingValue |
Value |
Name
è il nome del campo.
DefinedSize e ActualSize sono rispettivamente
la lunghezza del campo e la lunghezza del dato contenuto:
ad esempio un campo testo di 50 caratteri contenente Paolo
ha DefinedSize = 50 ed ActualSize = 5.
Type indica il tipo di campo e può assumere
i seguenti valori (tenete presente che non esistono solo database
Access):
Valore
|
Costante
|
0 |
Empty |
12 |
Variant |
10 |
Error
(32 bit Error Code) |
Con
segno: |
16 |
TinyInteger
(I1) |
2 |
Small
Integer (I2) |
3 |
Integer
(I4) |
20 |
Long
(I8) |
Senza
segno: |
17 |
TinyInteger
(UI1) |
18 |
Small
Integer (UI2) |
19 |
Integer
(UI4) |
21 |
Long
(UI8) |
|
4 |
Single |
5 |
Double |
7 |
Date |
133 |
Data
yyyymmdd |
134 |
Time
hhmmss |
135 |
Date/Time
yyyymmddhhmmss.6 decimali |
11 |
Boolean |
8 |
Binary String |
129 |
Character
String |
130 |
Unicode
String |
Il
formato è definito da Precision (n. digit)
e NumericScale (n. decimali), Currency
ha 4 decimali fissi ed è memorizzato in un Long; |
6 |
Currency |
14 |
Decimal |
128 |
Binary |
131 |
Numeric |
|
9 |
IDispatch
(interfaccia OLE) |
13 |
IUnknown
(interfaccia OLE) |
72 |
GUID |
132 |
User
Defined |
Value
è il contenuto del campo ed è la proprietà
di default: objRecordset.Fields("nomecampo") equivale
a
objRecordset.Fields("nomecampo").Value |
OriginalValue
è il contenuto del campo prima degli aggiornamenti
in corso.
UnderlyingValue è il contenuto del campo dopo
tutte le Update (anche di altri utenti) pendenti.
Nella
prossima lezione riprenderemo l'Esempio 1 e vedremo come applicare
le nuove conoscenze.
|