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 Acces Objects
Workspaces insieme degli oggetti Workspace
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
E' 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"
(o 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.
Ritorna
all'Indice