Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Lavorare con l'XML in SQL Server 2000

Analisi delle potenzialità di un connubio tutto da scoprire
Analisi delle potenzialità di un connubio tutto da scoprire
Link copiato negli appunti

Microsoft ha recentemente rilasciato una nuova versione dell'SQLXML provider,
indicata con il nome SQLXML 3.0. Questo nuovo provider ci permette di lavorare
con SQL Server 2000 in un modo veramente nuovo, difatti ora possiamo recuperare
i dati che arrivano da SQL Server in formato XML, oltre a ciò possiamo
applicare fogli di trasformazione XSLT, fare query XPATH ed usare template XML
per fare sia operazioni di recupero che di aggiornamento dei dati.

Cosa ci serve per installare il supporto XML?

Per lavorare con il nuovo provider è necessario avere installato MS
SQL Server 2000 e l'MDAC 2.6+ o superiore entrambi disponibili per il download
dal sito Microsoft ed ovviamente SQLXML3 scaricabile qui

La prima query XML

Per recuperare dati in formato XML da SQL Server 2000 Microsoft ha introdotto
nuove estensioni al linguaggio Transact SQL: la clausola FOR XML. Esaminiamo l'output di una classica query 'SELECT au_lname, au_fname FROM authors':

Au_lname

Au_fname

Bennet

Abraham

Blotchet-Halls

Reginald

Carson

Cheryl

Il risultato è un set di righe (rowset) con all'interno i valori delle colonne au_lname e au_fname contenuti nella tabella authors. Ora invece rivediamo la query precedente con l'aggiunta della clausola FOR XML appesa alla
fine dell'istruzione SELECT:
  'SELECT au_lname, au_fname FROM authors FOR XML AUTO'

<authors au_lname="Bennet"
au_fname="Abraham"/>

<authors au_lname="Blotchet-Halls" au_fname="Reginald"/>

<authors au_lname="Carson" au_fname="Cheryl"/>

<authors au_lname="DeFrance"
au_fname="Michel"/>

Come vedete l'istruzione SELECT con l'aggiunta della clausola FOR XML ritorna le righe della tabella authors come un blocco XML. Questa conversione rowset -> blocco XML viene chiamata serializzazione.

La serializzazione del rowset dei dati può essere controllata in modo preciso attraverso la clausola FOR XML, difatti possiamo scegliere sia il numero di righe che di colonne che vogliamo nell'output XML.

Microsoft SQLXML provider ci offre due possibilità per generare documenti XML:

lato SERVER (sarà SQL Server ad occuparsene)

lato CLIENT (sarà SQLXML ad occuparsene)

Formattazione dei documenti XML lato SERVER

Abbiamo già visto che per recuperare dati in formato XML da tabelle
relazionali Microsoft© ha introdotto l'estensione FOR XML all'interno dell'istruzione SELECT di SQL. Questo significa che ogni query fatta al database nella classica forma SELECT * FROM qualcosa può essere rielaborata per produrre un output XML grazie alla clausola FOR XML.

Supponiamo che una applicazione client invii la query sottostante a SQL Server 2000:

SELECT FirstName, LastName
FROM   Employees
FOR XML AUTO

I passi che SQL Server 2000 compie per elaborare la query sono due. Prima
risolve la parte della query in linguaggio SQL:

SELECT FirstName, LastName
FROM   Employees

ed infine applica la trasformazione FOR XML al rowset generato dalla query.
Il risultato è un blocco XML che viene inviato all'applicazione client
all'interno di un rowset formato da una singola colonna. Questa è la generazione lato SERVER del documento XML.

La clausola FOR XML supporta tre modalità lato SERVER:

  • RAW
  • AUTO
  • EXPLICIT

Le modalità di utilizzo delle varie opzioni possibili verranno esaminate più avanti.

Formattazione dei documenti XML lato CLIENT

Oltre alla modalità di formattazione lato SERVER svolta come abbiamo visto dal database SQLXML3 supporta la formattazione sul CLIENT del documento
XML. Quando una applicazione client invia una query del tipo:

SELECT FirstName, LastName
FROM   Employees
FOR XML RAW

solamente la parte classica della query viene eseguita sul server cioè:

SELECT FirstName, LastName
FROM   Employees

Al client in questo caso viene inviato il classico rowset sarà poi lo strato
intermedio dell'applicazione per esempio il web server, (grazie all'uso di una specifica ISAPI) ad applicare la trasformazione FOR XML al rowset così da ottenere il documento XML da inviare al client.

La clausola FOR XML supporta tre modalità lato CLIENT:

  • RAW - Simile a quella lato server
  • NESTED - Simile alla modalità AUTO del lato server
  • EXPLICIT - Simile a quella lato server

Le modalità di utilizzo delle varie opzioni possibili verranno esaminate più avanti.

NB: Quando usate la modalità AUTO abbinata ad una richiesta di formattazione lato CLIENT ricordate che tutta la formattazione avviene sul server indipendentemente dalla richiesta lato CLIENT.

Recuperare dati in XML da una pagina ASP

Le istruzioni ADO per recuperare dati XML da SQL Server 2000 sono simili a
quelle necessarie per ritornare i classici recordset. La maggiore differenza è la presenza dell'oggetto Stream necessario per poter ricevere il blocco XML. Non solo l'oggetto Stream può essere utilizzato per ricevere i dati XML ma anche altri oggetti che supportano l'interfaccia COM Istream come l'oggetto Response di ASP ad esempio.

Altre differenze riguardano nuove proprietà dell'oggetto Command che devono essere impostate per ricevere correttamente il flusso dati XML. Ecco due esempi.

Esempio 1

Codice per recuperare dati in formato XML da una pagina ASP lato CLIENT:

<%
1 Dim sSQLXML
2 Dim oStream
3 Dim oConnection
4 Dim oCommand
5 Dim sXML
6 Response.ContentType = "text/xml"
7 Set oStream = Server.CreateObject("ADODB.Stream")
8 Set oConnection = Server.CreateObject("ADODB.Connection")
9 Set oCommand = Server.CreateObject("ADODB.Command")
10 oConnection.Open "provider=SQLXMLOLEDB.3.0;data provider=SQLOLEDB.1;data
source=LUCASQLSRV_1;initial catalog=pubs;user id=sa;password=;"

11 oCommand.ActiveConnection = oConnection
12 sSQLXML = "SELECT * FROM authors FOR XML AUTO"
13 oCommand.CommandText = sSQLXML
14 oStream.Open
15 oCommand.Properties("ClientSideXML") = "True"
16 oCommand.Properties("Output Stream").Value = oStream
17 oCommand.Properties("xml root") = "autori"
18 oCommand.Execute , , 1024
19 oStream.Position = 0
20 oStream.Charset = "utf-8"
21 sXML = oStream.ReadText(-1)
22 oStream.Close
23 oConnection.Close
24 Set oStream = Nothing
25 Set oCommand = Nothing
26 Set oConnection = Nothing
27 Response.Write(sXML)
%>

Esempio 2

Codice per recuperare dati in formato XML da una pagina ASP lato SERVER:

<%
1 Dim sSQLXML
2 Dim oStream
3 Dim oConnection
4 Dim oCommand
5 Dim sXML
6 Response.ContentType = "text/xml"
7 Set oStream = Server.CreateObject("ADODB.Stream")
8 Set oConnection = Server.CreateObject("ADODB.Connection")
9 Set oCommand = Server.CreateObject("ADODB.Command")
10 oConnection.Open "provider=SQLOLEDB.1;data source=LUCASQLSRV_1;initial
catalog=pubs;user id=sa;password=;"
11 oCommand.ActiveConnection = oConnection
12 sSQLXML = "SELECT * FROM authors FOR XML AUTO"
13 oCommand.CommandText = sSQLXML
14 oStream.Open
15 eliminamo la Properties che attiva la trasformazione LATO-CLIENT
16 oCommand.Properties("Output Stream").Value = oStream
17 oCommand.Properties("xml root") = "autori"
18 oCommand.Execute , , 1024
19 oStream.Position = 0
20 oStream.Charset = "utf-8"
21 sXML = oStream.ReadText(-1)
22 oStream.Close
23 oConnection.Close
24 Set oStream = Nothing
25 Set oCommand = Nothing
26 Set oConnection = Nothing
27 Response.Write(strXML)
%>

Le differenze tra i due script non sono tante, ma sostanziali ed esplicative.
L'output comunque è identico, un documento XML  correttamente formatatto
che potete visualizzare su Internet Explorer 4 o superiore in un questo modo.

Per prima cosa instanziamo gli oggetti necessari per il recupero dei dati
XML: Stream, Command e Connection. Dopo apriamo la connessione al provider dati,
in questo caso ci sono differenze importanti tra il lato CLIENT e SERVER, visibili
alla riga 10 dei due esempi.

La trasformazione CLIENT richiede necessariamente di specificare SQLXMLOLEDB3 come provider e SQLOLEDB come data provider, infatti in questo caso il rowset in arrivo dal database viene passato da SQLOLEDB a SQLXMLOLEDB3 che si incarica della trasformazione di questo nel documento XML.

10 oConnection.Open "provider=SQLXMLOLEDB.3.0;data
provider=SQLOLEDB.1;data source=LUCASQLSRV_1;initial catalog=pubs;user id=sa;password=;"

Invece nella trasformazione lato SERVER il provider è quello classico
per accedere a SQL Server 2000 cioè SQLOLEDB, infatti in questo caso la
trasformazione è a carico del database.

10 oConnection.Open "provider=SQLOLEDB.1;data source=LUCASQLSRV_1;initial catalog=pubs;user id=sa;password=;"

Alla riga numero 6 specifico il content type della pagina ASP come
'text/xml', in questo modo quando visualizziamo la
pagina nel browser visualizzeremo la struttura gerarchica del
documento XML.

Una volta aperta la connessione apro l'oggetto Stream, preparo la query da inviare al server.

Setto il valore della proprietà 'Output Stream' dell'oggetto Command con l'oggetto Stream appena aperto, indicando in questo modo dove l'output dei dati XML deve essere diretto.

Setto il valore della proprietà 'xml root' dell'oggetto Command con la stringa 'autori'  indicando così il nome del tag radice del documento XML. Quindi eseguo la query con il metodo Execute dell'oggetto Command includendo il valore 1024 nella lista delle opzioni, corrispondente al valore della costante adExecuteStream.

Nelle righe successive setto le proprietà position e
charset dell'oggetto Stream per assicurami che lo stream venga letto dall'inzio e che il charset sia quello opportuno.

Quindi, tocco finale, chiamo il metodo ReadText dell'oggetto Stream per ricevere la stringa XML di output. Ricordiamoci di specificare il valore -1 come argomento di ReadText che corrisponde al valore della costante adReadAll, questo è necessario per leggere tutto il contenuto dell'oggetto Stream.

L'unica differenza tra i due scripts rimane la riga numero 15 del listato
dell'esempio 1:

15 oCommand.Properties("ClientSideXML") = "True"

La proprietà ClientSideXML deve essere settata a True, in questo modo il documento XML viene generato sul client e non sul server. Ovviamente il valore di default di questa proprietà è False.

Considerazioni finali

L'idea veramente innovativa di questa nuova tecnologia introdotta da Microsoft è quella di unire l'efficienza delle query relazionali nel recuperare i dati alla flessibilità dell'output XML per il successivo sfruttamento dei dati ottenuti. L'uso di SQL Server 2000 e del provider SQLXML ci fornisce un ambiente omogeneo creare applicazioni DATA/XML oriented, senza l'uso di oggetti COM esterni o quant'altro sarebbe necessario alla trasformazione XSLT , creazione dei dati XML, ecc…

Una futura innovazione potrebbe consistere nell'abbinare le funzionalità dell'SQLXMLOLEDB provider non solo a SQL Server 2000, ma renderlo disponibile anche per altri prodotti di RDBMS.

Ti consigliamo anche