APPUNTI SU ADO (ACTIVEX DATA OBJECTS) Introduzione ADO (Activex Data Object) è il sistema di accesso a database che noi utilizzeremo in ambiente Microsoft, sia da Visual Basic sia da pagine ASP. Activex è un file con estensione OCX che può essere incorporato in un programma inserendolo in una finestra di dialogo, impostandone le proprietà e aggiungendo il codice dell evento. È simile a una DDL (Dinamic Linked Library): si collega al programma in modo dinamico. Cenni di storia: In passato l accesso di programmi ai database era complicato. Per ciascun database usato era necessario conoscere la relativa API (Application Programming Interface) a basso livello. La necessità di uno standard fu affrontata con ODBC (Open DataBase Connectivity), che proponeva la realizzazione di una API universale. La nuova impostazione che supera i limiti di ODBC è OLEDB (Object Linking & Embedding DataBase), che rappresenta uno sviluppo della tecnologia più generale che Microsoft sta portando avanti: la tecnologia COM (Component Object Model). ADO fa parte del progetto Microsoft più generale Universal Data Access (UDA) e rappresenta l evoluzione e il superamento di alcuni limiti di precedenti modalità di accesso ai database come Data Access Objects (DAO) e Remote Data Objects (RDO). N.B. Per applicazioni Visual Basic che usano la libreria ADO è necessario inserire il riferimento Microsoft ActiveX Data Objects 2.1 Library del menu Strumenti Riferimenti di Visual Basic Gerarchia di accesso ai dati Applicazione Visual Basic, C++, ASP, ADO OLEDB ODBC ACCES SQL Altri provider di dati Nel seguito degli appunti si descriverà sommariamente l architettura di ADO, in riferimento a una piattaforma di sviluppo Microsoft Visual Basic 6. In un altra dispensa si riprenderanno le tecniche di programmazione in ambiente di sviluppo ASP. Infine in appendice si riassumono schematicamente le caratteristiche di ADO. 9 Gen. 2007 pag. 1/7
Il modello a oggetti ADO Il modello a aggetti ADO è costituito da un insieme di oggetti programmabili che supporta COM (Component Object Model) e OLE Automation al fine di utilizzare la potente tecnologia OLEDB. Nel modello ADO sono disponibili sette oggetti, organizzati in modo debolmente gerarchico. Nella figura seguente sono rappresentati due schemi. In bianco le collezioni e in grigio gli oggetti. Oggetto Connection Questo oggetto gestisce le informazioni sulla connessione, ad esempio il tipo di cursore, la stringa di connessione, il time out della query, il time out della connessione, il database predefinito. Tra i diversi modi di aprire una connessione preferiamo quello indicato nei passaggi seguenti: 1. Dichiarare un oggetto connessione; 2. Istanziarlo 3. Dichiarare una stringa 4. Inserire nella stringa l elenco dei parametri necessari con i rispettivi valori 5. Aprire la connessione Ecco il codice di esempio per una connessione Visual Basic: Dim conn As ADODB.Connection Dichiarare un oggetto Connection Set conn = New ADODB.Connection Istanziare l oggetto Dim strconn As String Dichiarare una stringa per la connessione Definire la stringa di connessione StrConn = Provider = Microsoft.Jet.OLEDB.4.0; & _ Data Source = C:\<Path del DB>\<Nome del DB> conn.open strconn Aprire la connessione 9 Gen. 2007 pag. 2/7
Oggetto Recordset È un gruppo di righe di una tabella o restituite da una query con il relativo cursore. È possibile aprire un oggetto Recordset, senza aprire esplicitamente un oggetto Connection. Creando un getto Connection, si potranno tuttavia aprire più Recordset nella stessa connessione. Le principali proprietà, metodi, cursori, bloccaggi e opzioni sono in appendice. Aprire un Recordset Un recordset può essere aperto usando tre metodi: il metodo Execute dell oggetto Connection il metodo Execute dell oggetto Command il metodo Open dell oggetto Recordset. Preferiamo usare il terzo metodo con la sintassi: rs.open [Source, [ActiveConnection, [CursorType, [LockType, [Options]]]]] Esempio: supponendo aperta la connessione conn e definendo come sorgente la tabella AnagDip, si ha la sequenza: Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset rs.cursortype = adopenkeyset vedere tabella Tipi di cursore rs.locktype = adlockoptimistic vedere tabella Tipi di bloccaggio rs.open AnagDip, conn,,,adcmdtable vedere tabella Opzioni Chiudere di un Recordset rs.close Set rs = Nothing Navigare su un Recordset Sequenza per andare avanti: Private Sub CmdProssimo_Click() rs.movenext If rs.eof Then rs.moveprevious MostraCampi procedura di visualizzazione dei campi nel form End Sub Sequenza per tornare indietro: Private Sub CmdPrecedente_Click() rs.moveprevious If rs.bof Then rs.movenext MostraCampi procedura di visualizzazione dei campi nel form Oggetto Field Contiene informazioni su una singola colonna di dati di un Recordset. L oggetto Recordset utilizza la collezione Fields per raggruppare tutti gli oggetti Field ad esso correlati. Le informazioni dell oggetto Field includono il tipo di dati, la precisione e la scala numerica. Le principali proprietà dell oggetto Field. sono elencate in appendice. 9 Gen. 2007 pag. 3/7
Accesso ai campi di un record Un campo può essere indicato usando il nome del campo oppure il numero della colonna. Esempi: rs.fields( Cognome ).Value = Rossi rs.fields( Cognome ) = Rossi equivalente alla precedente MyString = rs.fields(2) Assegna alla stringa MyString il valore della seconda colonna Un altro modo di indicare un campo di un recordset consiste nell uso del punto esclamativo! (in inglese: bang). Esempio: rs!cognome = Rossi Aggiungere un record ad un Recordset 1. Usare il metodo AddNew per aggiungere una nuova riga. Tutti i campi saranno impostati ai valori di default 2. Riempire i campi secondo la necessità e i vincoli 3. Usare il metodo Update per salvare la nuova riga. Il nuovo record diventa il record corrente. Esempio: With rs.addnew.fields("cognome") = "Rossi".Fields("Nome") = "Mario".Update End With Cancellare un record in un Recordset 1. Muoversi alla riga interessata 2. Usare il metodo Delete per eliminarla N.B. Dopo che un record è stato cancellato rimane ancora il record corrente, il precedente rimane il precedente e il successivo rimane il successivo. Così bisogna usare il metodo MoveNext ammesso che il record cancellato non sia l ultimo, perché in tal caso si verificherebbe un errore. Pertanto è necessario gestire ogni situazione. Esempio: Si eliminano tutte le righe di una tabella: Public Sub EliminaTabella(strTable As String) With rs If.RecordCount > 0 Then.MoveFirst Do.Delete ' Senza il seguente MoveNext, ADO continuerebbe ' ad eliminare sempre la stessa prima riga..movenext Loop Until.EOF End With End Sub Modificare un campo di una riga di un Recordset 1. Spostarsi sul record interessato 2. Effettuare le modifiche 3. Aggiornare il record con il metodo Update Esempio: 9 Gen. 2007 pag. 4/7
Public Sub ModificaRiga() With rs.find "[Titolo] = 'Boss'" If.EOF Then MsgBox "Nessun record trovato!" Else.Fields("Titolo") = "Capo".Update End With End Sub Oggetto Command Gestisce le informazioni su un comando, ad esempio una stringa di query, le definizioni di un parametro e così via. È possibile eseguire una stringa di comando su un oggetto Connection di una stringa di query all apertura di un oggetto Recordset, senza definire un oggetto Command. L oggetto Command è utile per definire i parametri di una query o eseguire una stored procedure che restituisce parametri di output. L oggetto Command supporta una serie di proprietà che descrivono il tipo e lo scopo della query e consentono ad ADO di ottimizzare l operazione. Oggetto Error Contiene informazioni di errore estese relativamente alle condizioni di errore causate dal provider di dati. Poiché una singola istruzione può generare più errori, la collezione Errors può contenere più oggetti Error contemporaneamente. Oggetto Parameter Un singolo parametro associato all oggetto Command. L oggetto Command utilizza la collezione Paramenters per raggruppare oggetti Parameter ad esso correlati. Gli oggetti Parameter possono essere creati automaticamente inviando query ad database. Tuttavia è possibile creare questo insieme anche tramite programma per migliorare le prestazioni durante l esecuzione. Oggetto Property È una caratteristica definita dal provider per un oggetto ADO. Gli oggetti ADO presentano due tipi di proprietà: incorporate e dinamiche. Le proprietà incorporate sono implementate in ADO e disponibili per ogni nuovo oggetto ADO. Le proprietà dinamiche sono definite da un provider di dati sottostante e fanno parte dell insieme di Properties del rispettivo oggetto ADO. Una proprietà può, ad esempio indicare se un oggetto Recordset supporta le transazioni o l aggiornamento. Si tratta di una delle funzioni più potenti di ADO poiché consente al provider di servizi di ADO di fornire interfacce speciali. 9 Gen. 2007 pag. 5/7
Appendice Principali proprietà dell oggetto Recordset BOF Indica se la posizione del record corrente è forzata a posizionarsi prima del primo record Bookmark Imposta o restituisce un segnalibro che identifica univocamente il record corrente, o imposta come record corrente un record identificato da un segnalibro valido CursorType Imposta o restituisce il tipo di cursore usato in un recordset. EOF Indica se la posizione del record corrente è forzata a posizionarsi dopo l ultimo record. Filter = Permette di estrarre le righe del recordset che rispondono alla condizione <condizione> argomento della proprietà LockType Imposta o restituisce il tipo di blocco imposto sul record durante l editing. Sort = <campo> Ordina il recordset secondo il campo indicato nella proprietà Source Imposta o restituisce la sorgente (nome della tabella o oggetto command) del recordset Principali metodi dell oggetto Recordset AddNew Crea un nuovo record per un recordset aggiornabile Close Chiude un recordset aperto, con tutti gli oggetti dipendenti Delete Cancella il record corrente. Find Trova il prossimo record che incontra una condizione Move Muove la posizione del record corrente in un oggetto Recordset MoveFirst Cursore sul primo record MoveLast Cursore sull ultimo record MoveNext Cursore sul prossimo record MovePrevious Cursore sul record precedente Open Apre un cursore su un recordset Update Salva ogni cambiamento effettuato sul record corrente UpdateBatch Scrive tutti gli aggiornamenti batch pendenti sul disco Tipi di cursore dell oggetto Recordset Valore numerico Costante simbolica Descrizione 1 (default) adopenforwardonly Cursore utilizzato per visualizzare i dati; consente movimenti solo in avanti: è il più veloce dei cursori 2 adopenkeyset Consente tutti i movimenti sui record; non visualizza i record aggiunti dagli altri utenti 3 adopendynamic Consente tutti i movimenti; gli inserimenti e gli aggiornamenti sono visibili agli utenti; è il più lento dei cursori 4 adopenstatic Cursore statico utilizzato per visualizzare i dati. Non consente manipolazione per gli utenti finali 9 Gen. 2007 pag. 6/7
Tipi di bloccaggio dell oggetto Recordset Valore Costante simbolica Descrizione numerico 1 (default) adlockreadonly La tabella è bloccata in sola lettura; non si possono modificare i record 2 adlockpessimistic Il gestore dei dati assicura che le operazioni di aggiornamento dei dati si concludano correttamente, bloccando i record ad uno ad uno per tutta la durata delle operazioni di modifica 3 adlockoptimistic Blocca i record uno ad uno solo quando viene attivato il metodo Update 4 adlockbatchoptimistic Come il precedente, ma riferito ad operazioni di aggiornamento in modalità batch Opzioni per Recordset Valore numerico Opzione Descrizione 1 adcmdtext Dice al provider di valutare la sorgente come istruzione SQL 2 adcmdtable Dice ad ADO di generare una query SQL per trovare tutte le righe dalla tabella o query il cui nome è specificato nella sorgente 512 adcmdtabledirect Dice al provider di restituire tutti i record della tabella o query il cui nome è specificato nella sorgente 4 adcmdstoredproc Dice al provider di valutare la sorgente come stored procedure o query 8 adcmdunknown Dice ad ADO di interrogare il provider per determinare se la sorgente è una stored procedure, il nome di una tabella o un istruzione SQL 256 adcmdfile Dice ad ADO che il parametro sorgente è il nome di un file contenente un recordset Principali proprietà della collezione Fields Proprietà Descrizione Count Indica il numero di campi nel record dell oggetto recordset Name Imposta o restituisce il nome del campo Value Imposta o restituisce il contenuto del campo (default) Attributes Indica una o più caratteristiche 9 Gen. 2007 pag. 7/7