Questo
tutorial nasce per un mio amico, ma visto che spesso vedo
domande del genere su forum o mailing list ho deciso di renderlo
pubblico. Vi consiglio di leggerlo tutto di in un fiato, tanto
non è molto lungo.
I
database sono fondamentali nella programmazione di qualsiasi
tipo di gestionali, questi permettono di organizzare in maniera
ottimale i dati. Sui dati immagazzinati in un database si
possono svolgere differenti operazioni, questi infatti possono
essere modificati, aggiornati, aggiunti, eliminati o consultati,
a seconda delle nostre necessità.
Per svolgere queste operazioni si ricorre a un insieme di
programmi detto DBMS (DataBase Manegement
System) che in pratica è un software che fa
da tramite tra l'utente e la base di dati, fornendo così
una rappresentazione logica dei dati.
I DBMS forniscono diversi modi per rappresentare un database
logicamente:
» Gerarchici.
» Ad oggetti.
» Relazionali.
Qui li ho elencati in ordine di apparizione sul mercato. I
gerarchici hanno caratterizzato i primi DBMS sviluppati intorno
alla metà degli anni 70.
Questo sistema è basato sugli alberi. E' tutt'ora utilizzato
anche se in pochi casi.
Il modello ad oggetti è dato da un insieme di classi,
che definiscono le caratteristiche ed il comportamento degli
oggetti del database.
Questo permette di inserire nel database delle informazioni
sulle operazioni da eseguire oltre ai dati.
Ad oggi sfortunatamente manca un linguaggio standard per l'interrogazioni
dei database basati sul modello ad oggetti.
Il modello relazionale nato da Codd nel 1970 è stato
però iniziato ad utilizzare intorno al 1980.
Questo modello è basato sul principio di insieme ed
è il modello che noi useremo in questo tutorial.
I dati sono organizzati in delle tabelle bidimensionali composte
da un numero fisso di colonne dette attributi ed in genere
sono etichettati e da un numero fisso di righe dette enuple.
Le righe identificano un record, cioè un insieme di
campi che corrispondono al valore della colonna in quella
riga. Qui di seguito segue una rappresentazione grafica sommaria
di un database; quella più in alto nella seguente lista
è formata da quella seguente e così via:
Approfondiamo
ora l'argomento DBMS. Elenchiamo ora i suoi componenti software
basilari :
» GESTORE DEGLI ACCESSI: trasforma le operazioni
di accesso ai dati in chiamate a procedure del gestore della
memoria fisica.
» PRECOMPILATORE DEL LINGUAGGIO OSPITE: svolge
un'analisi delle istruzioni del Database Definition Language
(DDL) e ne ricava le specifiche chiamate alle procedure
del DBMS e passa il codice trasformato al processore di interrogazioni.
» PROCESSORE DI INTERROGAZIONI: traduce le istruzioni
dal linguaggio usato a quello del DBMS.
» COMPILATORE DELLE DEFINIZIONI DEI DATI: riceve
le istruzioni dal linguaggio usato per definire la tipologia
dei dati del database e genera il Dizionario dei dati.
» GESTORE DELLA MEMORIA FISICA: gestisce l'allocazione
dei dati nella memoria di massa.
» INTERFACCIA UTENTI: permette all'utente di interagire
col database.
Il DBMS deve svolgere i seguenti compiti:
» Deve controllare in dati in modo da evitarne la ridondanza.
» Gestisce l'accesso ai dati attraverso uno schema concettuale,
cioè deve fornire una organizzazione visiva del database
indipendentemente dall'organizzazione fisica dei dati.
» Deve gestire l'accesso concorrente ai dati in modo da
evitare blocchi e errori.
I database che prenderemo in considerazione in questa lezione
sono quelli realizzati con Microsoft Access .
Fatta questa piccola premessa se non avete familiarità
con Access vi consiglio la lettura di qualche piccolo tutorial.
Passiamo ora a spiegare a spiegare la tecnologia che useremo
in questo tutorial, cioè ADO.
La
Microsoft con UDA (Universal Data Access) ha definito
un insieme di interfacce e regole necessarie per la gestione
di qualsiasi tipo di base di dati.
Da UDA è nata una interfaccia di programmazione COM che
incapsula diversi servizi di fornitura e gestione dei dati,
questa è: OLEDB.
Questa tecnologia permette di lavorare con le basi di dati più
diverse tra loro, usando comunque una interfaccia simile per
tutte.
L'OLEDB è costituito da diversi oggetti che hanno diverse
funzioni specifiche.
I tre componenti che formano l'OLEDB sono:
» DATA PROVIDERS: sono oggetti che contengono ed
espongono i dati al mondo esterno.
» SERVER COMPONENT: elaborano e trasportano i dati,
sostituendo le logiche DBMS delle fonti di dati con cui lavorano.
» DATA CONSUMER: sono le applicazioni necessarie.
La tecnologia OLEDB è necessaria naturalmente per quasi
tutti i database presenti sul mercato.
La
sigla A.D.O. sta per ActiveX Data Object
ed è basata su OLEDB. Questo modello di programmazione
molto semplice permette:
» La connessione ai dati OLEDB.
» L'esecuzione di comandi di accesso alla sorgente.
» La gestione automatica di una cache con i risultati
di tali comandi per meglio esaminare e manipolare l'informazione
derivata dalla rete.
» La riduzione generale del traffico di rete rendendo
così tale modello l'interfacci ideale per lo sviluppo
su internet.
Grazie ad ADO abbiamo finalmente una interfaccia comune ed estendibile
allo stesso tempo per l'accesso ai dati. In questo modo si tende
ad eliminare la necessità di dover scegliere quale metodologia
di accesso usare per ogni applicazione.
Passiamo ora al fulcro del nostro discorso.
Il
metodo che noi useremo per aprire la connessione ad un database
access è la seguente:
strConn
= "Provider = Microsoft.Jet.OLEDB.4.0; Data Source
=" & App.Path & _ "\fattura.mdb"
Set conn = CreateObject("ADODB.Connection")
conn.Open strConn |
Naturalmente preceduto dalla dichiarazione di queste variabili:
Public
conn, strConn, SQL, rs |
Il
nome del nostro database è fattura.mdb e si trova nella
stessa cartella della applicazione (come si nota facilmente
da App.path & "\....":). Fino ad ora non sono
ancora state specificate le tabelle e i campi che andremo
a interrogare tramite una query sul database, questi infatti
saranno specificati man mano.
Fare
una query significa in parole povere porre una domanda al
database.
Noi potremmo chiedere al database diverse cose, ad esempio
di dirci tutti i record che contiene in una determinata tabella,
quanti record ha con un campo uguale a un determinato valore
e quali sono etc
per fare questo ricorriamo a dei comandi
SQL (Structured Query Language), che altro non è
che uno standard per l'interrogazione dei database, usato
da ormai tutti i DBMS in circolazione (DataBase Manegement
System) con qualche piccola variazione, noi utilizzeremo quello
usato da MS Access .
Il nostro primo esempio consisterà nel leggere tutta
la tabella fornitori del database fatture.mdb (già
aperto in precedenza). Per svolgere questa semplice operazione
bastano le seguenti due righe di codice:
SQL
= "SELECT * FROM fornitori" 'seleziona
i dati dalla tabella fornitori
Set rs = CreateObject("ADODB.Recordset")
'setta rs come un record per ADO
rs.Open SQL, conn 'apre il record |
Il
simbolo asterisco (star in inglese) (*) viene detta wildcard
e serve per indicare che vengono selezionati tutti i record
del database, se invece vorremo operare la ricerca solo su
alcuni campi, li dovremo specificare, scelta migliore anche
quando servono tutti per far risparmiare tempo di elaborazione
al computer.
Nel successivo esempio selezioniamo tutti i campi nazione
e cognome, dove in nazione è contenuta la parola Italia:
SQL
= "SELECT nazione, cognome FROM fornitori WHERE nazione
= 'Italia' " 'seleziona i dati
dalla tabella fornitori
Set rs = CreateObject("ADODB.Recordset")
'setta rs come un record per ADO
rs.Open SQL, conn 'apre il record |
Per
interrogare un determinato campo, dopo aver fatto il SELECT
si utilizza l'rs("nomecampo"); per esempio per visualizzare
il valore del campo in una textbox scriveremo:
Text1.Text
= rs("nomecampo") |
Nella
seguente tabella illustreremo in principali comandi SQL con
un piccolo esempio:
Alter
Table |
Modifica
la struttura di una tabella.
Ha due clausole:
ADD: aggiunge una colonna alla tabella, la sintassi
è:
"ALTER
TABLE Tabella ADD NuovaColonna Char(1)" |
Char(1) è il tipo della colonna.
Si può aggiungere anche INIT dopo il Char(1) per
inizializzare la colonna.
MODIFY: modifica le caratteristiche di una determinata
colonna. La sintassi è:
"ALTER
TABLE Tabella MODIFY NuovaColonna Char(1)" |
|
Between
|
Inserito
in un SELECT vede se il valore di un campo è contenuto
in un determinato range. Esempio:
"SELECT
* FROM tabella WHERE campo BETWEEN A And Z" |
|
Count |
Conta
i record selezionati. Per leggere il valore ottenuto bisogna
fare rs("varConta"). Esempio:
"SELECT
COUNT(*) As varConta FROM tabella" |
|
Create
Table |
Crea
una tabella.
Esempio:
"CREATE
TABLE tabella(var1 char(15) not null, var2 char(20)
not null)" |
Crea una tabella con due campi di nome var1 con una lunghezza
di massimo 15 caratteri e var2 con una lunghezza massima
di 20 caratteri.
Entrambi devono essere non nulli. |
Delete |
Elimina
uno o più record da una tabella.
Sintassi:
"Delete
* FROM tabella WHERE <condizione>" |
Esempio:
"Delete
* FROM tabella WHERE id=1" |
|
Distinct |
Viene
usato per selezionare i campi da un database escludendo
i suoi duplicati. Esempio:
"SELECT
DISTINCT campo FROM tabella" |
Oppure è usato in combinazione col Count per evitare
di contare due volte i campi duplicati.
Esempio:
"SELECT
COUNT(DISTINCT campo) As varConta FROM tabella" |
|
Drop
Table |
Cancella
una tabella.Esempio:"Drop Table tabella" |
In |
Seleziona
dei record che hanno dei valori specificati in un campo.
Esempio:
"SELECT
* FROM tabella WHERE campo IN ('valore1', 'valore2')" |
|
Insert
Into |
Inserisce
dei dati in una tabella. Lo inserisce in coda alla tabella.
Esempio:
"Insert
Into user (a, b, 11)" |
se
si inseriscono tutti i campi oppure
"INSERT
INTO tabella(campo1, campo2) VALUES (val_campo1,
val_campo2) |
inserisce solo nei campi specificati |
Min
e Max |
Seleziona
il minimo o il massimo da un database. Queste funzioni
possono anche essere usate con stringhe e non solo con
valori numerici come si potrebbe pensare.
Esempio:
"SELECT
Min(campo) FROM tabella" 'il
minimo
"SELECT Max(campo) FROM tabella" 'il
massimo |
|
Order
By |
Ordina
in ordine crescente (ASC) o decrescente (DESC) i dati
contenuti in un un Select.
Esempio:
"SELECT
* FROM tabella Order By campo ASC" 'ordine
crescente
"SELECT * FROM tabella Order By campo DESC"
'ordine decrescente |
|
SELECT(LIKE) |
Seleziona
dei dati da un database. Non mi dilungo perché
l'ho già fatto nella sezione 4 di questo tutorial.
Aggiungo solo che il carattere jolly tra due stringhe
è l'underscore (_). L'esempio troverà pala,
para, paca, etc
Esempio:
"SELECT
* FROM tabella WHERE campo='pa_a'" |
|
UPDATE |
Modifica
il valore di un campo già presente nel database.
La sintassi è:
"UPDATE
NomeTabella SET campo1 = 'nuovovalore1', campo2
= 'nuovovalore2'
WHERE nomecampo = 'valorecampodiriferimento'" |
|
Ho
escluso i comandi riguardanti le interrogazioni su più
tabelle. Tengo a dire che l'SQL è un linguaggio di
interrogazione database molto utile in molte situazioni ed
utilizzabili in quasi tutti i linguaggi (se non tutti), vi
consiglio quindi la lettura di un libro (o tutorial) apposito.
NOTA: Per una lista più ricca di comandi SQL vi
consiglio una lettura di una lista presente nel mio tutorial
intitolato: "MySQL per Tutti" presente su www.e-salerno.it.
|