Introduzione all'uso dei database con ASP


Home Page | Comments | Articles | Faq | Documents | Search | Archive | Tales from the Machine Room | Contribute
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.
Il Browser quindi riceve solo HTML puro, questo fa' dell'ASP un sistema di programmazione che non dipende dal browser usato, a differenza del DHTML che invece soffre delle diversita' tra i vari Browser in circolazione.

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:

  • Aver configurato il nostro database nel Pannello di Controllo di ODBC

  • oppure
  • Specificare direttamente tutta la sequenza di parametri che ci consente di collegarci

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.
La seconda soluzione e' più complicata ma ci permette di cambiare il database usato 'al volo' senza dover modificare configurazioni e cose cosi'.

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 :
If rec.EOF And rec.BOF Then...
sappiamo che il nostro recordset e' vuoto e possiamo prendere le precauzioni del caso.

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:

  • abbiamo aperto il recordset specificando che si tratta di un RecordSet scrollabile specificando ,3,3 dopo la nostra SELECT.

  • oppure
  • abbiamo fatto una MoveLast() subito dopo l'apertura del RecordSet.
Se facciamo una MoveLast() teniamo conto che non tutti i Recordset ci consentono poi di fare una MoveFirst() per ritornare all'inizio, Questo perche' ODBC deve gestire qualunque tipo di database, anche i piu' idioti, e non tutti i database consentono di scorrere le tabelle in tutti i e due i sensi (in su' ed in giu'), quindi lui per default crea un recordset del tipo piu' semplice: che va solo in un senso.

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.
Esempio:


' 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.

1 commento

paolo dice il 07/07/2008 19:38:
grazie. Alcuni punti sono molto utili e descritti raramente.

Add a comment (max 1000 chars)

Comment from:
Comment:


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 was composed with VIM, now is composed with VIM and the (in)famous CMS FdT.

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.
Web Interoperability Pleadge is this a valid html document?

Last Update: 04/12/2008