Le
"Collections" in Microsoft Visual Basic |
Le
Collections di Oggetti sono insiemi numerati di oggetti
dello stesso tipo che hanno quindi le stesse Proprietà
e supportano gli stessi Metodi; numerati vuol dire che
i singoli componenti della Collection sono individuati dall'indice,
che varia da 0 a N-1.
Ad esempio la ProprietàX del 4° elemento della
Collection Pluto verrà individuata come Pluto(3).ProprietàX.
Abbiamo visto nella lezione precedente la struttura di Microsoft
Jet e come sia basata sulle Collections.
Adesso le esamineremo senza voler esaurire l'argomento: metodi
e proprietà verrano illustrati più avanti negli
esempi di programmazione mentre per il dettaglio si rimanda
all'Help Dao351.chm contenuto nella MSDN Library.
(Scarica
il file Dao351.zip - 607kb)
I
Data Access Objects (DAO) |
»
Workspaces
E' l'insieme delle aree di lavoro; se non si devono gestire
più gruppi di lavoro con sicurezze diverse non è
necessario preoccuparsene in quanto al primo riferimento ad
un oggetto DAO viene creata automaticamente l'area DbEngine.Workspaces(0).
Il metodo più importante è per noi OpenDatabase:
Set
oggettodb = [arealavoro.]OpenDatabase(nomedb, opzioni,
sola lettura, connessione)
|
che
ci consente di aprire il Db desiderato; poi il metodo Close
ci consentirà di chiuderlo quando avremo terminato,
ma se ce ne dimenticheremo il Sistema lo farà automaticamente
a fine esecuzione del nostro programma.
»
Databases
Insieme degli oggetti Database è evidentemente l'oggetto
più importante: le collections che contiene ci consentiranno
tutte le operazioni sui dati ed anche sulla struttura stessa
del Database (stando però molto attenti perché
quest'ultima è una cosa delicata!).
Dei metodi citiamo:
CreateQueryDef per creare un oggetto Query temporaneo
o permanente;
Execute per eseguire una Query di comando
OpenRecordset per creare un oggetto Recordset con il
risultato di una Query di selezione o per aprire una Tabella
» database.TableDefs
Insieme degli oggetti TableDef
» database.QueryDefs
insieme
degli oggetti QueryDef
Gli oggetti TableDef e QueryDef contengono le definizioni
delle strutture (non i dati!) delle Tables e delle Queries
del Database.
Ricorreremo ad essi per conoscere o modificare la struttura
degli oggetti esistenti o per aggiungerne dei nuovi a programma.
» database.Recordsets
Insieme degli oggetti Recordset.
L'oggetto Recordset contiene solo la Collection Fields
ed è quello che ci permette tutte le operazioni sui
dati; tramite questo possiamo aggiungere, cancellare, modificare
i dati.
Esaminiamo il metodo OpenRecordset, quello che ci permette
di aprirlo:
Set
oggettors = oggettodb.OpenRecordset(origine[, tipo[,
opzioni[, lockedit]]])
|
dove:
origine = una Table od una Query esistenti o una istruzione
SQL;
tipo = uno dei seguenti: dbOpenTable, dbOpenDynaset,
dbOpenSnapshot (quest'ultimo non aggiornabile); ovviamente
dbOpenTable è consentito solo se l'origine è
una Table.
Lo Snapshot è un oggetto statico: non solo non
è aggiornabile ma non viene rigenerato automaticamente
da MS Jet se vengono modificati i dati delle Tables o Queries
dalle quali è estratto; è molto veloce ma consuma
parecchie risorse in quanto tutto il Recordset viene creato
in memoria.
opzioni e lockedit riguardano limitazioni all'accesso
(es: read only). I metodi OpenDatabase e OpenRecordset
possono essere eseguiti in due modi, esplicito od implicito.
Nel primo caso avremo del codice tipo:
Dim
MioDb As Database
Dim MioRs As
Recordset
'..........
'..........
Set MioDb = OpenDatabase("C:\Prove\Prova1.mdb",
True, False)
Set MioRs = MioDb.OpenRecordset("Pippo",
dbOpenTable)
'.......... |
abbiamo
così aperto Prova1.mdb in modo esclusivo non read-only
e quindi la Table Pippo.
Nel secondo caso abbiamo inserito un controllo Data ed abbiamo
specificato le Proprietà in fase di progetto nel modo
seguente:
Connect
= Access (default)
DatabaseName = "C:\Prove\Prova1.mdb"
Exclusive = True
ReadOnly = False (default)
RecordsetType = 0 - Table
RecordSource = Pippo
|
All'atto
della esecuzione del Form contenente il controllo Data MS
Jet effettuerà in DbEngine.Workspace(0) l'equivalente
delle istruzioni:
Set
Data1.Database = OpenDatabase("C:\Prove\Prova1.mdb",
True, False)
Set Data1.Recordset = Data1.Database.OpenRecordset("Pippo",
dbOpenTable)
|
Attenzione
però a non metterle mai scritte così in un programma
perché otterreste un errore!
E' possibile assegnare a programma Proprietà e/o Oggetti
ad un controllo Data, ma il metodo da seguire lo vedremo più
avanti.
Vediamo
adesso i principali metodi supportati dall'oggetto Recordset:
MoveFirst, MoveLast, MoveNext, MovePrevious
per spostarsi;
FindFirst, FindLast, FindNext, FindPrevious
per trovare un record che soddisfa un criterio Seek
solo per tipo Table con Indice - ricerca per chiave;
AddNew, Edit, Update per inserire, modificare,
rendere effettivo l'inserimento o l'aggiornamento;
Delete per cancellare il record corrente;
Move per spostarsi di un numero di records avanti o
indietro rispetto al record corrente o ad un Bookmark
(=segnalibro).
Abbiamo
citato Table con Indice, ma come si fà
a dire che c'è un indice?
Usando la proprietà Index dell'oggetto Recordset;
supponendo che la tabella Pippo abbia 2 indici, Pluto e Paperino,
allora aggiungeremo nel nostro programma:
nel Caso1:
nel
Caso2:
Data1.Recordset.Index
= "Pluto"
|
Invece
del nome possiamo usare la collection Indexes mettendo
invece di "Pluto":
oppure
Data1.Recordset.Indexes(0))
|
essendo
Name la proprietà di default di Indexes (.Indexes(0)
equivale a scrivere .Indexes(0).Name).
ATTENZIONE
- Quanto detto e quanto diremo è valido sia per Visual
Basic 5 che per Visual Basic 6 edizioni Professional ed Enterprise.
Per la edizione Standard (o Learning) esistono delle limitazioni
sul trattamento degli Oggetti.
Per quanto riguarda invece i vari Service Pack ho trovato
un errore per il parametro Connect del metodo OpenDatabase
nella sintassi di specificazione della eventuale Password
corretto solo da un Service Pack di Vb6: la sintassi corretta
è "; pwd=password" (Access non va indicato)
ma con Vb5, Vb5+SP3 e Vb6 dava errore e bisognava invece usare
solo "; password"; con il S.P.3 di Vb6 accetta finalmente
la sintassi corretta.
Non so con i Service Pack 1 e 2 perché non li ho istallati
e sono passato direttamente al 3.
» "DAO
Advanced Programming" di Dan Haught
» "ADO,
DAO and RDO in Visual Basic" gruppo
Microsoft
»
"microsoft.public.vb.database.dao"
gruppo di discussione
» "DAO"
definizione secondo SearchDatabase.com
» "Choosing
ADO or DAO for Working with Access Databases" gruppo
Microsoft
|