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