ASP e Database

Introduzione

Asp esprime le sue massime potenzialità nell'interazione con i database. Grazie a questa interazione è possibile sviluppare potenti applicazioni in cui conservare, inserire, modificare e leggere dati, sfruttando semplici comandi SQL. Asp utilizza il driver ODBC (Open Database Connectivity) e l'oggetto ADO (ActiveX Data Object) per stabilire connettività tra un database ed una semplice pagina (o complessa applicazione) Asp. I principali (R)DBMS con cui Asp può interagire sono i classici di casa Microsoft, ovvero Ms Access e Sql Server, ma è possibile interagire anche con prodotti come mySql, Oracle ed altri.

In questa sede ci utilizzeremo Ms Access (preferibilmente versione 2000) per implementare i nostri esempi.


Introduzione ad ADO

Come già detto, grazie all'oggetto ADO è possibile manipolare i dati di una fonte di dati ODBC. In questa fase daremo un'occhiata alle principali caratteristiche di ADO, esaminando i suoi oggetti con relativi metodi e proprietà.

L'oggetto principale tra le varie collezioni di ADO è Connection che offre connettività tra un database ed una pagina Asp. E' possibile creare un'istanza dell'oggetto Connection in una variabile, ad esempio Cn, utilizzando il seguente codice:

var Cn = new Server.CreateObject("ADODB.Connection");

oppure con la classica sintassi JScript

var Cn = new ActiveXObject("ADODB.Connection");

La classe che permette di creare un'istanza dell'oggetto Connection è quindi ADODB.Connection.

I principali metodi di Connection sono Open(), Execute() e Close() che si occupano rispettivamente di aprirà la connessione verso un database, di eseguire un comando SQL e di chiudere la connessione in questione. Vedremo un esempio in seguito, appena spiegati altri concetti teorici fondamentali.

Le principali proprietà di Connection sono ConnectionTimeout, che permette di stabilire in secondi quanto deve durare una connessione, e Version che restituisce la versione di ADO che si sta utilizzando.

Altro oggetto fondamentale di ADO è Recordset, la cui collezione utilizzata all'atto della creazione di una nuova istanza dell'oggetto è ADODB.Recordset.

var Rs = new Server.CreateObject("ADODB.Recordset");

oppure con la classica sintassi JScript

var Rs = new ActiveXObject("ADODB.Recordset");

Abbiamo memorizzato nella variabile Rs l'istanza dell'oggetto creato.

L'oggetto Recordset dispone fondamentalmente di una proprietà ed un metodo, ovvero la proprietà EOF (End Of File - lo analizzeremo in seguito) e del metodo MoveNext() che muove il cursore di ADO sul record successivo; analogamente i metodi MovePrevious(), MoveFirst() e MoveLast() muovono il cursore del Recordset rispettivamente verso il record precedente, il primo e l'ultimo; ad ogni modo esistono anche i metodi Open() e Close().


Un semplice esempio di lettura dei dati

Per sviluppare un semplice esempio iniziale, creiamo file Access e chiamiamolo database.mdb; al suo interno la tabella anagrafe composta dai campi id (di tipo Contatore), nome e cognome (entrambi di tipo Testo); salviamo la tabella senza impostare nessuna chiave primaria quando richiesto. inseriamo qualche dato all'interno della tabella, ed il database è pronto!

Creiamo una nuova pagina Asp e chiamiamola lettura.asp ed inseriamo il seguente codice:

<%@LANGUAGE = JScript%>
<%
    var Cn = new ActiveXObject("ADODB.Connection");
    var StrCn = "driver={Microsoft Access Driver (*.mdb)};
	dbq=" + Server.MapPath("database.mdb");

    Cn.Open(StrCn);

    var Sql = "SELECT * FROM anagrafe";

    var Rs = Cn.Execute(Sql);

    if (Rs.EOF) Response.Write("Nessun dato presente");
    else while (!Rs.EOF)
    {
        Response.Write("<p>Nome: " + Rs("nome") + "
		<br>Cognome: " + Rs("cognome") + "</p>");
        Rs.MoveNext();
    }

    Cn.Close();
%>

Il codice appena presentato effettua i seguenti passi:

1. crea l'oggetto Connection e si connette al database mediante la stringa di connessione (StrCn)

var Cn = new ActiveXObject("ADODB.Connection");
var StrCn = "driver={Microsoft Access Driver (*.mdb)};
dbq=" + Server.MapPath("database.mdb");

2. Apre la connessione

Cn.Open(StrCn);

3. Esegue una stringa SQL

var Sql = "SELECT * FROM anagrafe";
var Rs = Cn.Execute(Sql);

Non a caso ho utilizzato il nome Rs come variabile per memorizzare l'esecuzione della stringa SQL: il metodo Execute() pur se non associato esplicitamente ad un oggetto Recordset, fa comunque parte della sua collezione.

4. Verifica che nel database ci siano dati (record)

if (Rs.EOF) Response.Write("Nessun dato presente");

Anche in questo caso vale il discorso che la proprietà EOF, anche se non associata esplicitamente ad un oggetto Recordset, fa comunque parte della sua collezione.

5. In caso ci siano dati nel database, esegue un ciclo while per tirare fuori tutti i record presenti

else while (!Rs.EOF)
{
    Response.Write("

Nome: " + Rs("nome") + "
Cognome: " + Rs("cognome") + "

"); Rs.MoveNext(); }

6. Chiude la connessione

Cn.Close();

Un semplice esempio di scrittura dei dati

Vediamo adesso come sfruttare l'oggetto Recordset per inserire dati nella stessa tabella dello stesso database creato in precedenza.

Di seguito il codice della pagina inserimento.asp

<%@LANGUAGE = JScript%>
<%
    var Cn = new ActiveXObject("ADODB.Connection");
    var StrCn = "driver={Microsoft Access Driver (*.mdb)};
	dbq=" + Server.MapPath("database.mdb");

    Cn.Open(StrCn);

    var Rs = new ActiveXObject("ADODB.Recordset");
        Rs.Open("anagrafe",Cn,3,3);
            Rs.AddNew();
                Rs("nome") = "Luca";
                Rs("cognome") = "Ruggiero";
            Rs.Update();
        Rs.Close();

    Cn.Close();
%>

Anche in questo caso creiamo l'oggetto Connection ed apriamo la connessione al database, chiudendola alla fine delle operazioni. Analizziamo adesso più nel dettaglio il codice per l'inserimento dei dati mediante l'oggetto Recordset:

var Rs = new ActiveXObject("ADODB.Recordset"); 
// Crea l'oggetto Recordset

Rs.Open("anagrafe",Cn,3,3); 
// Apre il recordset specificando la tabella, 
la connessione e dei parametri opzionali
    Rs.AddNew(); 
// Il metodo AddNew() 
predispone il Recordset all'inserimento di nuovi dati
        Rs("nome") = "Luca"; 
// Inserisco dati nel campo "nome"
        Rs("cognome") = "Ruggiero"; 
// Inserisco dati nel campo "cognome"
    Rs.Update(); 
// Aggiorno il Recordset: attenzione, 
Update non sta per modifica dei dati, ma per refresh
Rs.Close(); 
// Chiudo il Recordset

Autore: Luca Ruggiero