Connessione al database con Visual Basic NET? Lo trovi su Opentraining.it Visual Basic Italia Lezione 4 - Le Collections in Visual Basic ed i Data Access Objects

Le "Collections" in MS 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 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:

MioRs.Index = "Pluto"

nel Caso2:

Data1.Recordset.Index = "Pluto"

Invece del nome possiamo usare la collection Indexes mettendo invece di "Pluto"

MioRs.Indexes(0)

(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