Appunti su ADO Alessandro Benedetti ITIS “E. Divini” San Severino Marche (MC) 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 Appunti su ADO Alessandro Benedetti ITIS “E. Divini” San Severino Marche (MC) 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 Appunti su ADO Alessandro Benedetti ITIS “E. Divini” San Severino Marche (MC) 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 End If 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 End If 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 Appunti su ADO Alessandro Benedetti ITIS “E. Divini” San Severino Marche (MC) 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 If 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 Appunti su ADO Alessandro Benedetti ITIS “E. Divini” San Severino Marche (MC) Public Sub ModificaRiga() With rs .Find "[Titolo] = 'Boss'" If .EOF Then MsgBox "Nessun record trovato!" Else .Fields("Titolo") = "Capo" .Update End If 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 Appunti su ADO Alessandro Benedetti ITIS “E. Divini” San Severino Marche (MC) Appendice Principali proprietà dell’oggetto Recordset BOF Bookmark CursorType EOF Filter = <condizione> LockType Sort = <campo> Source Indica se la posizione del record corrente è forzata a posizionarsi prima del primo record Imposta o restituisce un segnalibro che identifica univocamente il record corrente, o imposta come record corrente un record identificato da un segnalibro valido Imposta o restituisce il tipo di cursore usato in un recordset. Indica se la posizione del record corrente è forzata a posizionarsi dopo l’ultimo record. Permette di estrarre le righe del recordset che rispondono alla condizione argomento della proprietà Imposta o restituisce il tipo di blocco imposto sul record durante l’editing. Ordina il recordset secondo il campo indicato nella proprietà Imposta o restituisce la sorgente (nome della tabella o oggetto command) del recordset Principali metodi dell’oggetto Recordset AddNew Close Delete Find Move MoveFirst MoveLast MoveNext MovePrevious Open Update UpdateBatch Crea un nuovo record per un recordset aggiornabile Chiude un recordset aperto, con tutti gli oggetti dipendenti Cancella il record corrente . Trova il prossimo record che incontra una condizione Muove la posizione del record corrente in un oggetto Recordset Cursore sul primo record Cursore sull’ultimo record Cursore sul prossimo record Cursore sul record precedente Apre un cursore su un recordset Salva ogni cambiamento effettuato sul record corrente Scrive tutti gli aggiornamenti batch pendenti sul disco Tipi di cursore dell’oggetto Recordset Valore numerico Costante simbolica 1 (default) adOpenForwardOnly 2 adOpenKeyset 3 adOpenDynamic 4 adOpenStatic 9 Gen. 2007 Descrizione Cursore utilizzato per visualizzare i dati; consente movimenti solo in avanti: è il più veloce dei cursori Consente tutti i movimenti sui record; non visualizza i record aggiunti dagli altri utenti Consente tutti i movimenti; gli inserimenti e gli aggiornamenti sono visibili agli utenti; è il più lento dei cursori Cursore statico utilizzato per visualizzare i dati. Non consente manipolazione per gli utenti finali pag. 6/7 Appunti su ADO Alessandro Benedetti ITIS “E. Divini” San Severino Marche (MC) Tipi di bloccaggio dell’oggetto Recordset Valore numerico 1 (default) 2 3 4 Costante simbolica Descrizione adLockReadOnly La tabella è bloccata in sola lettura; non si possono modificare i record 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 adLockOptimistic Blocca i record uno ad uno solo quando viene attivato il metodo Update adLockBatchOptimistic Come il precedente, ma riferito ad operazioni di aggiornamento in modalità batch Opzioni per Recordset Valore numerico Opzione adCmdText 1 2 adCmdTable 512 adCmdTableDirect 4 adCmdStoredProc 8 adCmdUnknown 256 adCmdFile Descrizione Dice al provider di valutare la sorgente come istruzione SQL Dice ad ADO di generare una query SQL per trovare tutte le righe dalla tabella o query il cui nome è specificato nella sorgente Dice al provider di restituire tutti i record della tabella o query il cui nome è specificato nella sorgente Dice al provider di valutare la sorgente come stored procedure o query Dice ad ADO di interrogare il provider per determinare se la sorgente è una stored procedure, il nome di una tabella o un’istruzione SQL Dice ad ADO che il parametro sorgente è il nome di un file contenente un recordset Principali proprietà della collezione Fields Proprietà Count Name Value Attributes 9 Gen. 2007 Descrizione Indica il numero di campi nel record dell’oggetto recordset Imposta o restituisce il nome del campo Imposta o restituisce il contenuto del campo (default) Indica una o più caratteristiche pag. 7/7