Interoperabilità L’utilizzo contemporaneo di sorgenti di dati (data source) eterogenee in singole applicazioni è il principale problema in progetti complessi e distribuiti. La soluzione passa attraverso l’adozione di standard di comunicazione supportati dai sistemi coinvolti. Tra le varie proposte, per l’ambiente Win NT/Win98, lo standard vincente sembra essere ODBC. Open Database Connectivity (ODBC) Open Database Connectivity (ODBC), proposto dalla Microsoft nel 1991, fornisce un’interfaccia applicativa standard che permette ad una generica applicazione di accedere a diverse data source eterogenee di tipo relazionale. Tramite un’interfaccia ODBC, le chiamate SQL presenti nell’applicazione possono accedere ad una sorgente relazionale remota. Il linguaggio supportato da ODBC è una restrizione dell’SQL, definito per la prima volta nel 1991 nell’ambito dell’SQL Access Group (SAG) da un gruppo di circa 50 grandi utenti di DBMS. L’architettura ODBC prevede il collegamento tra un’applicazione e il server che gestisce i dati attraverso un database driver, una libreria dinamica che un’applicazione può richiamare per accedere ad una particolare sorgente. In questo modo un’applicazione può accedere a ciascuna sorgente per la quale è disponibile il driver ODBC. Il driver maschera anche le differenze di interazione relative al sistema operativo ed al protocollo di rete utilizzato, facilitando la portabilità delle applicazioni. Infatti, il codice sorgente scritto per un tipo di sorgente di dati (definita su uno specifico DBMS commerciale, sistema operativo e protocollo di rete) non deve essere (che lievemente) modificato nel caso di cambiamento del tipo di sorgente dati. Architettura ODBC L’accesso ad un database (remoto) tramite ODBC richiede la cooperazione di 4 componenti: • L’Applicazione richiama le funzioni SQL per esequire query ed acquisire i risultati. E’ trasparente rispetto al protocollo di rete, al sistema operativo ed al server DBMS utilizzati, poiché mascherati dal driver. • Il Driver Manager è responsabile di caricare i driver richiesti dall’applicazione. Viene fornito da Microsoft e garantisce la gestione della corrispondenza tra i nomi e l’inizializzazione dei processi coinvolti. • I driver sono responsabili di eseguire le funzioni ODBC, eseguendo le query SQL traducendole nella sintassi (e semantica) del proprio server di accesso. I driver sono anche responsabili della restituzione dei risultati alle applicazioni tramite meccanismi di buffer. • La fonte dei dati (Data Source Name) rappresenta il database con il quale si vuole comunicare. I driver inviano le chiamate (opportunamente tradotto) al Data Source che le esegue sul server DBMS. Ulteriori aspetti di standardizzazione: • Linguaggio di interrogazione SQL basato sulle specifiche di SQL-92 • Codici di errore di run-time standardizzati • Rappresentazione standard dei data-type: ciscun sistema fornisce l’eventuale tabella di conversione. • Modalità standard di connessione e dei messaggi di log. Stringa di connessione ODBC: indica la sequenza di parametri che sono inviati al driver manager per aprire una connessione ODBC. Ciascun driver prevede parametri comuni ed altri specifici per il proprio server DBMS. Parametri comuni: DSN = ODBC data source name UID = User ID or user name PWD = Password (specify PWD=; for an empty password) DBA = Database attribute (W=write access, R=read-only access) Connessione ODBC verso SQL SERVER Per aprire una connessione ODBC verso SQL Server occorre: 1. Definire una fonte dati (Data Source) utilizzando il driver di SQL Server. 2. Utilizzare la funzione SQLConnect con l’appropriata stringa di connessione ODBC. Codice Visual Basic per l’apertura di una connessione ODBC Dim rc As Integer, henv As Long, hdbc As Long Dim Dlen As Integer, DSN As String ' Allocate the environment handle. rc = SQLAllocEnv(henv) ' Allocate a connection handle. rc = SQLAllocConnect(ByVal henv, hdbc) DSN = "MyDSN" UID = "MyUserID" PWD = "MyPassword" ' Connect using the arguments provided. rc = SQLConnect(hdbc, DSN$, Len(DSN$), _ UID, Len(UID), PWD, Len(PWD)) ' Test for a successful connection. If rc = SQL_SUCCESS Or rc = SQL_SUCCESS_WITH_INFO Then Print "Connection open" Else Print "Connection did not open" End If DescribeError henv, hdbc, 0 Connessione ODBC verso ORACLE 8.0 Oracle8 ODBC Driver prevede la gestione della comunicazione attraverso le seguenti funzioni: SQLConnect (DBQ, UID, PWD) DBQ Il Database Service Name. UID user login ID o user name. PWD la password dell’utente (PWD=; per specificare password vuota). SQLDriverConnect (DSN, DBQ, UID, PWD) DSN il nome del data source presente nel file odbc.ini. DBQ Il Database Service Name. UID user login ID o user name. PWD la password dell’utente. Esempi di stringhe di connessione valide: DSN=Personnel;UID=Kotzwinkle;PWD=; DRIVER={Oracle ODBC Driver}; UID=Kotzwinkle; PWD=whatever; DBQ=instl_alias; SQLProcedures e SQLProcedureColumns Queste funzioni permettono di conoscere le procedure e le funzioni definite dall’utente all’interno di un pacchetto. Vediamo un esempio, assumendo di aver definito le seguenti procedure: "BAR" "BARX" "XBAR" "XBARX" "SQLPROCTEST.BAR" "SQLPROCTEST.BARX" "SQLPROCTEST.XBAR" "SQLPROCTEST.XBARX" Cercando "%" or "%%%%%%", ritornano tutte e 8 le procedure. Cercando "%_" o "_%", ritorna: "BAR" "BARX" "XBAR" "XBARX" Cercando "." o ".%" o "%.%" o "SQLProc%." o "SQLProc%.%", ritorna: "SQLPROCTEST.BAR" "SQLPROCTEST.BARX" "SQLPROCTEST.XBAR" "SQLPROCTEST.XBARX" Cercando "%bar", ritorna: "BAR" "XBAR" Cercando ".%bar" o "%.%bar", ritorna: "SQLPROCTEST.BAR" "SQLPROCTEST.XBAR" Cercando "SQLProc%" o ".SQLProc%", ritorna: nothing (0 rows) Connessione ODBC verso MS ACCESS97 Utilizzando MS Access97 è possibile collegare tabelle di server DBMS attraverso l’interfaccia ODBC. Dopo aver effettuato il collegamento, una tabella ODBC può essere manipolata allo stesso modo di quelle “proprie”: le limitazioni riguardano le funzioni abilitate da driver ODBC. Nell'esempio riportato di seguito viene indicato come collegare la tabella Autori del database ODBC al database corrente. DoCmd.TransferDatabase acLink, "Database ODBC", _ "ODBC;DSN=OrigineDati1;UID=Utente2;PWD=www;LANGUAGE=italiano;" _ & "DATABASE=pub", acTable, "Autori", "dboAutori" Connessione con ODBCDirect Per eseguire, tramite chiamate a procedura, query ODBC in MS Access97 si utilizza la tecnologia ODBCDirect. ODBCDirect è una tecnologia che consente di utilizzare i server di database ODBC senza caricare il modulo di gestione di database Jet di Microsoft. ODBCDirect si basa sul modello di Microsoft DAO 3.5. Vantaggi dell'accesso ai dati ODBC con ODBCDirect • Con ODBCDirect è possibile eseguire il codice in maniera più veloce ed efficiente fornendo l'accesso diretto alle origini dei dati ODBC. Non dovendo caricare il modulo di gestione di database Microsoft Jet, ODBCDirect richiede al client una quantità limitata di risorse. Il server ODBC si occupa dell'intera elaborazione delle query. • ODBCDirect fornisce un accesso migliore a funzionalità specifiche del server che non sono disponibili utilizzando ODBC mediante Microsoft Jet. Ad esempio supporta la specifica del cursore. • ODBCDirect consente di specificare la posizione del cursore, sia a livello locale che di server. Per interagire con le routine memorizzate a livello di server, inoltre, è possibile specificare i valori di input e verificare i valori restituiti, procedura che non è possibile eseguire con Microsoft Jet. • ODBCDirect, inoltre, supporta le query asincrone. Quando si esegue una query, non è necessario attenderne il termine dell'esecuzione prima di iniziare un'altra operazione. È possibile registrare l'esecuzione della query verificando la proprietà StillExecuting. • ODBCDirect supporta l'aggiornamento batch, consentendo di memorizzare nella cache le modifiche apportate all'oggetto Recordset a livello locale e di sottomettere tali modifiche al server in un singolo comando batch. • Con ODBCDirect è possibile creare set di risultati semplici e senza cursore o più complessi e con cursore. È inoltre possibile eseguire query che restituiscono qualsiasi numero di set di risultati, limitare il numero di righe restituite e monitorare tutti i messaggi e gli errori generati dall'origine dei dati remota, senza compromettere la prestazione dell'esecuzione della query. Creazione di un'area di lavoro ODBCDirect È possibile creare un'area di lavoro di ODBCDirect specificando la costante dbUseODBC per l'argomento tipo del metodo CreateWorkspace. Una volta creata un'area di lavoro ODBCDirect, è possibile utilizzare specifici oggetti DAO, proprietà e metodi per lavorare con i dati sul server del database ODBC. Esecuzione di query con ODBCDirect E’ possibile creare ed eseguire una query SQL su di una sorgente ODBC utilizzando l’oggetto QueryDef. Un oggetto QueryDef è una definizione memorizzata di una query in un database Microsoft Jet o in un'area di lavoro di ODBCDirect. Set querydef = oggetto.CreateQueryDef (nome, testosql) querydef Variabile di oggetto che rappresenta l'oggetto QueryDef che si desidera creare. oggetto Variabile di oggetto che rappresenta un oggetto Connection o Database aperto che contiene il nuovo oggetto QueryDef. nome Opzionale. Tipo di dati Variant di sottotipo String che assegna un nome univoco al nuovo oggetto QueryDef. Testosql Opzionale. Tipo di dati Variant di sottotipo String, vale a dire un'istruzione SQL valida che definisce l'oggetto QueryDef. Se si omette questo argomento, è possibile definire l'oggetto QueryDef impostando la sua proprietà SQL prima o dopo averlo accodato ad un insieme. Per eseguire l'istruzione SQL in un oggetto QueryDef, utilizzare il metodo Execute o OpenRecordset. In un'area di lavoro ODBCDirect, l'argomento testosql può specificare un'istruzione SQL o una procedura memorizzata Microsoft SQL Server e i suoi parametri. L'utilizzo di un oggetto QueryDef è il modo migliore per eseguire delle query SQL di tipo pass-through con database ODBC. Query di tipo pass-through Utilizzando le query di tipo pass-through è possibile inviare comandi direttamente ad un server di database ODBC (quale Microsoft SQL Server). Con le query di tipo pass-through, vengono utilizzate direttamente le tabelle presenti sul server invece di stabilire un collegamento. 1 2 3 4 5 6 7 Creare una nuova query. Scegliere Specifica SQL dal menu Query, quindi scegliere PassThrough. Sulla barra degli strumenti, fare clic su Proprietà per visualizzare la finestra delle proprietà della query. Nella finestra delle proprietà della query, impostare la proprietà StringaConnessODBC per specificare informazioni sul database al quale si desidera collegarsi. È possibile digitare le informazioni relative alla connessione o fare clic sul pulsante dei generatori, quindi immettere le informazioni relative al server a cui si sta effettuando il collegamento. Se la query non è del tipo che restituisce record, impostare la proprietà RestituisciRecord a No. Nella finestra Query SQL pass-through, digitare la query di tipo passthrough. Per eseguire la query, fare clic su Esegui sulla barra degli strumenti. Per una query di tipo pass-through che restituisce record, è possibile invece fare clic sul pulsante delle visualizzazioni sulla barra degli strumenti. Routine di esecuzione di query con ODBCDirect Public Sub eseguiQueryODBC() Dim wrkODBC As Workspace Dim qdf As QueryDef Dim strSQL As String Dim conImp As Connection Dim rs As Recordset Set wrkODBC = CreateWorkspace("ODBCWorkspace", "admin", _ "", dbUseODBC) Workspaces.Append wrkODBC Set conImp = wrkODBC.OpenConnection("provadoc1", , , _ "ODBC;DATABASE=doc1;UID=doc1;PWD=aohgf;DSN=provadoc1") strSQL = "SELECT NOME FROM DIPENDENTE" Set qdf = conImp.CreateQueryDef(conImp.Name, strSQL) Set rs = qdf.OpenRecordset() While Not rs.EOF Debug.Print rs!Nome rs.MoveNext Wend wrkODBC.Close End Sub