Introduzione all'uso dei database con ASP |
| Asp per il Web |
ASP, che sta' per Active Server Pages, e' la tecnologia messa a
punto da Microsoft per aggirare il problema dei CGI sotto Windows.
Un CGI e' un programma che viene richiamato da un Web Server per
svolgere un determinato lavoro, e deve sottostare a determinate
caratteristiche, una delle quali e' che deve ricevere i comandi
dalla linea di comando e rispondere direttamente nello stesso modo.
Il problema di Windows e' che non c'e' una 'linea di comando', ne' qualche cosa per poter ricevere la risposta dal programma CGI. Si rende necessario un ulteriore livello. Un primo tentativo e' stato l'introduzione dello standard WinCGI, ma il colpo gobbo e' stato fatto inventando l'ASP, che in pratica rivoluziona completamente il modo di programmare il Web.
ASP consente infatti di mettere del codice Visual Basic direttamente
dentro la pagina HTML, il codice viene interpretato dal Web Server
nel momento in cui la pagina viene caricata per essere inviata al
Browser dell'utente che la richiede, il risultato dell'elaborazione
viene inviato.
|
|
| Cosa puo' fare ASP? |
L'utilizzo di ASP varia dall'elaborazione dei dati immessi dall'utente
in una Form, alla creazione di una pagina personalizzata in risposta a
determinate condizioni, fino alla realizzazione di un sito completamente
'attivo'.
Una delle capacita' di ASP e' la possibilita' di sfruttare i programmi COM, cioe' tutti i programmi che sfruttano la tecnologia OLE di Microsoft per poter fornire dati ad altri programmi che ne fanno richiesta (programmi con Word ed Excel per esempio, ma non solo). Sfruttando adeguatamente l'ADO, l'interfaccia OLE verso ODBC, e' possibile accedere direttamente da ASP ad un qualsiasi database supportato dallo stesso ODBC, interrogarlo ed apportare modifiche ai dati presenti.
|
|
| Connection e Recordset |
Per accedere tramite ASP ad un database si utilizzano due
Oggetti, che vengono creati utilizzando l'apposito comando
ASP Server.CreateObject,
questi oggetti sono la Connection, che rappresenta il punto
di aggancio al database ed il Recordset, che permette di
leggere i dati dal database stesso.
Dopo aver creato la Connection, la si deve 'aprire', attivando quindi il collegamento stesso con il database, per 'aprire' la connessione occorre:
oppure
La prima soluzione e' molto più semplice, ma richiede l'accesso alla
configurazione ODBC del server su cui il nostro sito Web e' posto, e
non sempre i WebMaster sono disponibili a farci
mettere le mani dentro, in alcuni casi poi è impossibile.
Ecco un esempio di creazione di una Connessione:
Dim conn
' creo la connessione per il database
Set conn=Server.CreateObject("ADODB.Connection")
' apro la connessione (uso il Pannello di Controllo)
conn.Open "My_ODBC_Dsn"
... faccio qualche cosa
' chiudo la connessione
conn.Close()
Set conn=Nothing
In questo caso ho utilizzato una 'sorgente dati' definita nel Pannello
di Controllo di ODBC, in questo modo devo solo specificare nella
Open della connessione il nome che ho assegnato alla 'sorgente dati'
nel Pannello di Controllo, ODBC si occuperà del resto.
Il codice seguente fà lo stesso, ma specificando tutti i parametri:
Dim conn
' creo la connessione per il database
Set conn=Server.CreateObject("ADODB.Connection")
' apro la connessione (specifico tutto)
conn.Open "Driver={Microsoft Access Driver (*.mdb)};DBQ=database.mdb"
... faccio qualche cosa
' chiudo la connessione
conn.Close()
Set conn=Nothing
Nella Open e' stato specifica quale 'driver' utilizzare (in questo
caso Microsoft Access) ed il nome del database .mdb da usare.
NB Notate che dopo aver 'chiuso' la Connection con Close(), vi ho assegnato Nothing, questo serve ad assicurarsi che l'oggetto venga eliminato e tutta la memoria rilasciata, non e' obbligatorio, me è consigliabile.
|
|
| Interrogare il database |
Una volta che la Connection e' aperta e' possibile utilizzarla.
Usare una connessione e' di solito possibile in due modi: leggendo
dei dati dal database oppure modificandoli.
Per leggere dei dati si utilizza l'oggetto Recordset. Un Recordset viene creato usando la funzione Execute() dell'oggetto Connection, passandogli il comando SQL da eseguire, di solito tale comando e' una SELECT che ritorna un elenco di record dal database. Una volta ottenuto il recordset e' possibile 'scorrerlo' usando MoveNext() per spostarsi al record successivo, o leggere i dati del record corrente usando Fields("nomedelcampo"). Esempio:
' apro la connection
.... vedi codice di prima
' creo il RecordSet
Dim res
Set res=conn.Execute("SELECT Nome, Cognome FROM AGENDA")
' ciclo finche' ci sono record
Do While Not res.EOF
' faccio qualche cosa con i dati
nome = res.Fields("Nome")
cognome = res.Fields("Cognome")
' prossimo record
res.MoveNext()
Loop
' chiudo il recordset
res.Close
Set res=Nothing
Ovviamente, se cerchiamo di accedere ad un campo che non e' presente
nella nostra tabella, sia nella SELECT che con Fields(), otterremo un
bell'errore.
|
|
| Un Recordset vuoto |
C'e' la possibilita' che una
SELECT non ritorni nessun record,
questo perche' la tabella e' vuota o perche' abbiamo incluso
delle condizioni WHERE percui tutti
i record vengono scartati.
In questo caso il codice precedente non fa' nulla perche' testa subito EOF, ma ci sono momenti in cui vorremmo essere avvisati del fatto che non c'e' nessun record nel nostro Recordset. Un recordset vuoto ha EOF e BOF contemporaneamente a True
Quindi :
|
|
| Contare i record nel recordset |
Il recordset ha una proprieta' chiamata
RecordCount,
la maggior parte delle volte questa proprieta'
vale -1
o non ha alcun senso.
A che serve questa proprieta'? RecordCount ha un valore sensato solo se:
oppure
Un'altra soluzione per avere il numero di record e' quello di fare
due query: la prima usando
SELECT COUNT(*) FROM tabella WHERE...
e la seconda per estrarre effettivamente i dati (quindi specificando
il nome dei campi invece di
COUNT(*),
la prima query a questo punto ritornera il numero di record che
verranno estratti dalla seconda, senza dover fare cose strane.
' apro la connection
.... vedi codice di prima
Dim rec
' conto il numero di record nella tabella
Set res=conn.Execute("SELECT COUNT(*) Conteggio FROM AGENDA")
numRecord=res.Fields("Conteggio")
res.Close
Set res=Nothing
' ora leggo i dati
Set res=conn.Execute("SELECT Nome, Cognome FROM AGENDA")
...faccio altre cose
' chiudo il recordset
res.Close
Set res=Nothing
In questo modo numRecord contiene il numero
di record che verranno estratti dalla seconda query.
|
|
| Modificare i dati |
Per modificare i dati il sistema piu' efficiente e' quello di usare
delle Query di comando, cioe' delle
INSERT, UPDATE o delle
DELETE ed eseguirle poi usando sempre il solito
comando Execute( "query" ). Per esempio:
' eseguo le modifiche nel database
Dim sql
sql = "UPDATE tabella SET campo1='" & stringa & "',"
sql = sql & "campo2=" & valore &
sql = sql & " WHERE " & condizioni
conn.Execute( sql )
sql = "INSERT INTO tabella "
sql = sql & "( campo1, campo2)"
sql = sql & " VALUES ('"
sql = sql & stringa & "'," & valore & ")"
conn.Execute( sql )
sql = "DELETE FROM tabella WHERE campo1='" & stringa & "'"
conn.Execute( sql )
|
|
| E' ODBC |
Una cosa che passa molto spesso inosservata e che viene spesso
dimenticata, e' che ASP comunica con il database tramite ADO/ODBC,
quindi quando parliamo con il DB, in realta' parliamo con ODBC.
Questo significa che dobbiamo usare l'SQL di ODBC, e non quello specifico del Database che stiamo usando. Se Access richiede le virgolette intorno alle date o le parentesi quadre o altre cose simili, ODBC non lo richiede, anzi intorno alle date ci vuole i cancelletti (#). Se siamo abituati ad usare l'asterisco come carattere jolly nelle nostre query ricordiamoci che il carattere jolly in ODBC SQL e' il percento (%).
|
|
| Stored Procedure ? Sì grazie. |
Tramite ODBC possiamo utilizzare anche delle Stored Procedure, sempre
che il database dall'altra parte le supporti, per richiamare una
Stored Procedure dobbiamo usare la EXEC del database, quindi inviamo
una query usando Conn.Execute( "EXEC nomestoredprocedure" ) Di solito le Stored Procedure non ritornano dati o, se lo fanno, li scrivono in una tabella temporanea che poi andremo a leggerci.
|
|
Comments Max length of comments: 1000 chars. |
2 commenti paolo dice il 07/07/2008 19:38: grazie. Alcuni punti sono molto utili e descritti raramente. Gianpiero dice il 31/12/2008 12:37: Ottima spiegazione, complimenti da uno alle prime armi che fino a 3 mesi fà non sapeva nemmeno scrivere "<br>" in html Add a comment (max 1000 chars)
|
| Author |
Davide Bianchi,
works as Unix/Linux administrator for a "network security" company of Haarlem. Contacts: mail: davide AT onlyforfun.net , ICQ: 268751033, Jabber: davideyeahsure AT gmail.com Skype: davideyahsure |
| Contribuire | Volete contribuire? Leggete come! |
| Copyright | This site is made by me with blood, sweat and gunpowder, if you want to republish or redistribute any part of it, please drop me (or the author of the article if is not me) a mail. |
This site isn't optimized for vision with any specific browser, nor
it requires special fonts or resolution.
You're free to see it as you wish.
Last Update: 06/01/2009