Stefano Schacherl Pagine ASP parte 3 I data base 2 I DataBase Con ASP è possibile interfacciare uno script ad una fonte di dati che rispetti lo standard detto ODBC (Open Database Connectivity). L'accesso ad essi avviene grazie all'oggetto ActiveX Data Object (abbreviato ADO), che fornisce connettività verso tutti i tipi di database che supportino ODBC, mediante un driver apposito. In ASP è praticamente prassi l'utilizzo dei database di Access, non a caso prodotto sempre da Microsoft. 3 I DataBase ADO contiene: 7 oggetti: • Connection • Command • Parameter • Recordset • Field • Property • Error 4 collezioni: • Fields • Properties • Parameters • Errors 4 I DataBase Gli oggetti più importanti sono Connection e RecordSet, che sono tra loro legati dal metodo Execute di Connection: 5 L'oggetto Connection ADODB è il tramite necessario per operare nelle pagine ASP, sia in lettura che in scrittura, su una fonte di dati ODBC. L'oggetto ActiveX che si occupa di fornire la connettività verso un database è Connection, che va dichiarato come un qualsiasi ActiveX: var ADOConn = new ActiveXObject("ADODB.Connection"); Tramite il riferimento ADOConn diventa possibile accedere a metodi e proprietà dell'oggetto Connection. 6 L'oggetto Connection L'oggetto Connection possiede numerose proprietà e metodi, tra i quali più importanti sono: Proprietà: ConnectionString (Contiene le informazioni utilizzate per stabilire una connessione a una fonte dati) Metodi: Open (Apre una connessione a una fonte dati) Execute (Esegue la particolare istruzione SQL passata al metodo mediante un parametro stringa) Close (Chiude un oggetto aperto) 7 L'oggetto Connection Riassumendo: • per utilizzare l'oggetto Connection: var ADOConn = new ActiveXObject("ADODB.Connection"); • per aprire il database: ADOConn.Open(strConn); passandogli un parametro strConn opportuno • per eseguire operazioni SQL sul database: var ris = ADOConn.Execute(sql); passandogli un parametro sql opportuno • per chiudere il database: ADOConn.Close(); 8 L'oggetto Connection La stringa strConn (stringa di connessione) che si deve passare al metodo open in ADOConn.Open(strConn); è costituita da una serie di coppie chiave=valore, separate tra di loro con un punto e virgola. Nel caso tipico è necessario inserire in tale stringa due chiavi, che indicano: • il formato di database utilizzato ("driver=…") • la sua locazione fisica nel file system del server ("dbq=…") . 9 L'oggetto Connection Ad esempio: var strConn = "driver={Microsoft Access Driver (*.mdb)}; dbq=" + Server.MapPath("mio.mdb"); E anche possibile passare altre informazioni (chiavi) nella stringa di connessione, ad esempio una password. 10 L'oggetto Connection Ci sono altre modalità di collegamento al database possibili; è possibile ad esempio registrare il database nell' ODBC del server assegnandogli un DSN (da pannello di controllo, icona ODBC, "DSN di sistema", ecc.) in modo da assegnargli un nome virtuale al nostro database, così da semplificare la stringa di connessione: var strConn = "nome_virtuale_db"; Per fare questo, però, bisogna avere accesso al Server e, ovviamente, non è sempre possibile. 11 L'oggetto RecordSet Il metodo Execute, come visto nell'esempio: var ris = ADOConn.Execute(sql); restituisce un riferimento ad un oggetto di tipo Recordset (che viene quindi creato automaticamente), che rappresenta una collezione di record del database. Ad esempio, con var ris = ADOConn.Execute("SELECT * FROM nominativi"); l'oggetto ris contiene tutti i campi di tutti i record presenti nella tabella nominativi del database. E' però possibile creare un oggetto RecordSet direttamente, che contenga l'intero db: ris = new ActiveXObject("ADODB.Recordset"); 12 L'oggetto RecordSet I Recordset possono essere immaginati come vere e proprie tabelle di dati, dove ogni riga corrisponde ad un record, un po' come nella rappresentazione visuale di Access. I valori dei singoli campi del record evidenziato dal cursore sono leggibili tramite l'utilizzo della sintassi: ris("nome_campo") Per poter visualizzare i dati della tabella è quindi possibile sfruttare i metodi e le proprietà degli oggetti Recordset. 13 L'oggetto RecordSet Nell'esempio seguente viene mostrato l'uso di EOF e MoveNext: while (!ris.EOF) { Response.Write("Record n° " + ris("id") + "<br>"); Response.Write("Nome: " + ris("nome") + "<br>"); Response.Write("Cognome: " + ris("cognom e") + "<br>"); ris.MoveNext(); } Quando si crea l'oggetto RecordSet si posiziona un "cursore" sulla prima riga della tabella; MoveNext() è il metodo che consente l'avanzamento alla riga successiva. La proprietà EOF (boolean) segnala la fine della tabella. 14 L'oggetto RecordSet Metodi principali: • AddNew • Close • Delete • Find • Move • MoveFirst - MoveLast • MoveNext - MovePrevious • Open • Seek • Update Proprietà principali: • BOF (primo record del recordset) • EOF (ultimo record del recordset) • Index 15 Usare l'oggetto RecordSet o SQL? Per quel che riguarda le operazioni di ricerca, inserimento, modifica e cancellazione ci sono due "filosofie": 1. Si usa una stringa SQL nel metodo Execute dell'oggetto Connection per eseguire tutte le operazioni; si usa il RecordSet ottenuto da una ricerca solo per la visualizzazione. 2. Si crea un oggetto RecordSet e su di esso si fanno tutte le operazioni volute. 16 Usare l'oggetto RecordSet o SQL? Nel primo caso si possono fare operazioni complesse (ricerca tutti i record dove …, cancella il record nel quale il nome è ...) con la scrittura di un'espressione SQL. Nel secondo caso si utilizzano le normali strutture di programmazione per la ricerca sul RecordSet, gestito in modo analogo ad un array di record. Noi utilizzeremo il primo metodo. 17 SQL Vediamo quindi come si eseguono ricerche, inserimenti, modifiche o cancellazioni su un database, utilizzando una stringa SQL nel metodo Execute dell'oggetto Connection. Dopo aver dichiarato un oggetto Connection ADOConn, si utilizza il metodo Execute: var ris = ADOConn.Execute(sql); passandogli una stringa sql, contenente un'istruzione SQL da eseguire. Cioè all'interno di questa stringa viene dichiarato al metodo Execute cosa fare. 18 SQL SQL (Structured Query Language) è un linguaggio che rappresenta lo standard per la definizione, l'interrogazione e la modifica dei database. La conoscenza dell'SQL esula dagli scopi di questo corso, ma per poter realizzare qualche applicazione è necessario vederne almeno qualche esempio. 19 SQL Recupero dati o interrogazioni (query) in SQL SELECT [<lista-colonne> | * ] FROM <lista-tabelle> [WHERE <condizione>] La condizione della clausola WHERE può essere una condizione semplice o composta, mediante gli operatori AND OR e NOT, da predicati semplici, in cui ciascun predicato rappresenta un confronto tra due valori. 20 SQL Esempi di ricerca: SELECT * FROM nominativi SELECT * FROM nominativi WHERE id > SELECT * FROM nominativi WHERE id > id < 15 SELECT * FROM nominativi WHERE nome 'Carlo' SELECT nome,cognome FROM nominativi nome LIKE 'carlo' SELECT * FROM nominativi WHERE nome '%carlo' SELECT * FROM nominativi WHERE nome '%carlo%' SELECT * FROM nominativi WHERE nome '%carlo%' ORDER BY cognome SELECT * FROM nominativi WHERE nome '%carlo%' ORDER BY cognome DESC 3 3 AND = WHERE LIKE LIKE LIKE LIKE 21 SQL Operazioni di aggiornamento in SQL INSERT INTO <nome-tabella> [(<listanomi-colonne>)] VALUES (<listavalori-colonne>) Es: INSERT INTO STUDENTI VALUES (‘Anna’,‘Turchese’,355773,’IF’,’Via Piave, 7 - Treviso’) DELETE FROM <nome-tabella> WHERE <condizione> Es: DELETE FROM STUDENTI WHERE Matricola=333878 22 SQL Operazioni di aggiornamento in SQL UPDATE <nome-tabella> SET <nome-attributo> = [<espressione> {, <nome-attributo> = <espressione>] [WHERE <condizione>] Es: UPDATE STUDENTI SET Codice = ‘IN’ WHERE Matricola > 400001 UPDATE nominativi SET [e-mail] = '[email protected]' WHERE nome = 'Carlo' AND cognome = 'Rossi' 23 Riassunto PER INIZIARE: • Si deve creare un'istanza dell'oggetto Connection: var ADOConn = new ActiveXObject("ADODB.Connection"); • si apre quindi il database: var strConn = "driver={Microsoft Access Driver (*.mdb)}; dbq=" + Server.MapPath("mio.mdb"); ADOConn.Open(strConn); n.b: ADOConn e strConn sono nomi di variabili, mio.mdb è il nome (con il percorso relativo) del database. 24 Riassunto PER LEGGERE E VISUALIZZARE: • Si deve usare il metodo Execute dell'oggetto Connection: var ris = ADOConn.Execute("SELECT * FROM nominativi"); • Si visualizzare i campi dell'oggetto ris : while (!ris.EOF) { Response.Write(ris("nome") + "<br>"); Response.Write(ris("cognome") + "<br>"); ris.MoveNext(); } n.b: ovviamente la stringa SQL può estrarre anche una selezione di record (o di campi), ad esempio: "SELECT * FROM nominativi WHERE nome = 'Carlo'" 25 Riassunto PER INSERIRE UN RECORD: • Si deve usare il metodo Execute dell'oggetto Connection: var ris = ADOConn.Execute("INSERT INTO nominativi VALUES (‘Anna’,‘Turchese’,’Via Piave, 7 - Treviso’)"); n.b: nella stringa i valori dei campi devono essere inseriti tutti, a meno di inserire i nomi dei campi: ("INSERT INTO nominativi (nome,cognome) VALUES (‘Anna’,‘Turchese’)" 26 Riassunto PER CANCELLARE UNO O PIU' RECORD: • Si deve usare il metodo Execute dell'oggetto Connection: var ris = ADOConn.Execute ("DELETE FROM nominativi WHERE nome='Anna'"); PER MODIFICARE UNO O PIU' RECORD: • Si deve usare il metodo Execute dell'oggetto Connection: var ris = ADOConn.Execute ("UPDATE STUDENTI SET nome = ‘Anna Maria’ WHERE cognome = 'Turchese'"); 27 L'oggetto RecordSet Vediamo come fare se si desidera utilizzare l'oggetto RecordSet. Per iniziare (vale per tutti gli esempi): var ADOConn = new ActiveXObject("ADODB.Connection"); ADOConn.Open(strConn); RS = new ActiveXObject("ADODB.Recordset"); RS.Open("tabella",ADOConn,3,3); Al termine ci dovrà essere: RS.Close(); Inserimento nuovo Record: RS.AddNew; RS("nome")="Pippo"; … RS.Update(); 28 L'oggetto RecordSet Cancellazione del Record nella posizione 3: RS.Move(2); RS.Delete; Modifica di un campo del Record nella posizione 2: RS.Move(1); RS("e-mail") = "pippo.it"; RS.Update(); Modifica del record nel quale un campo ha un determinato valore: while (RS("nome")!="Carlo") { RS.MoveNext(); } RS("nome")="GianCarlo"; RS.Update(); 29 ESERCITAZIONE Progetto proposto: RUBRICA TELEFONICA / E-MAIL (realizzata con database) - o un altro db a piacere nb.: si dovrebbe realizzare una pagina base (HTML) che consenta di scegliere l'operazione desiderata (lista completa, ricerca, modifica, inserimento nuovi dati e cancellazione), attivando quindi la pagina (HTML) con un modulo che richiami una pagina asp opportuna: 30 ESERCITAZIONE visualizza aggiungi MENU (html) cancella modifica Modulo (ricerca tutto o ricerca secondo criteri) (html) Pagina ASP Modulo (inserimento record) (html) Pagina ASP Modulo (visualizza tutto e scelta record da cancellare) (html) Pagina ASP Modulo (visualizza tutto e scelta record da modificare) (html) Pagina ASP