Tip iOS #37 – MSSQL effettuare query con SQLXML

iOSBuongiorno a tutti,

come indicato nel precedente articolo, dopo aver illustrato, sommariamente, le differenze  tra l’uso di una SOA e di un accesso diretto ad un DB, vediamo ora come accedere dalle nostre applicazioni in modo più o meno diretto ad alcuni dei principali RDBMS.

Cominciamo con il server MS-SQL di Microsoft. Questo RDBMS si è conquistato una grossa fetta di estimatori negli anni e, nonostante non segua, come tradizione della casa madre, gli standard è riuscito a mostrare alcune peculiarità interessanti come la gestione degli indici. Inoltre la possibilità di installarlo gratuitamente nelle versione Express e l’elevata integrazione con la versione server del sistema operativo e dei moduli dedicati ad internet, primo tra tutti IIS, lo hanno reso decisamente appetibile.

Sfogliando la rete si scopre che sono in molte le aziende che hanno annunciato la scrittura di un driver per l’accesso diretto al DB da parte dei dispositivi iOS, di questi driver si è persa bene o male ogni traccia. A venirci incontro è la stessa Microsoft mettendo a disposizione un modulo denominato Microsoft SQLXML, disponibile fin da SQL Server 2000 SP3, esso si presenta come un servizio a cui inviare una query SQL per ricevere i risultati in XML.

Questa soluzione è in realtà un ibrido tra l’accesso diretto al DB e la chiamata ad un servizio. E’ infatti possibile definire la query a livello di chiamante, questa però verrà filtrata attraverso il servizio prima di essere impacchettata e spedita al RDBMS per essere eseguita. Di contro provvederà a tradurre la risposta della query ed impacchettarla in una stuttura XML per essere poi trasferirla al chiamante.

La query viene passata come parametro sull’URL ed il risultato è direttamente espresso in XML, secondo l’approccio dei servizi REST GET.

Facciamo quindi un esempio pratico. Supponendo di avere una tabella, nel classico database NorthWind, denominata CATCLI, contenente le categorie dei clienti, e composta da due campi ID e DESCRIZIONE contenente i seguenti dati:

ID DESCRIZIONE
1 PRIVATO
2 GROSSISTA
3 DETTAGLIANTE

 

E’ possibile ottenere i dati contenuti con la seguente query:

SELECT * FROM CATCLI

che richiamata dalla nostra applicazione diviene:

http://IISServer/nwind?sql=SELECT+*+FROM+CATCLI+FOR+XML+AUTO&root=root

Rispetto alla query originaria si notano immediatamente delle differenze. La prima riguarda la sua conversione in un URL. Infatti dopo l’indirizzo del server (in questo esempio IISServer, sostituibile con l’indirizzo del dominio a cui si vuole accedere), nell’URL compare il termine nwind. Esso è il database a cui vogliamo accedere per effettuare la query, quindi vi è il parametro sql seguito dalla query ed infine il parametro root.

Quest’ultimo indica che l’XML di risposta avrà un’unico item in radice e tale item sarà denominato root.

La query adopera come separatori i simboli più e non gli spazi (codificati solitamente in con il testo %20). Infine dopo la clausola FROM troviamo una nuova clausola: FOR XML AUTO

E’ proprio questa clausola ad indicare che la query una volta eseguita dovrà essere convertita in formato XML.

Questo sistema è valido in caso di query brevi e soprattutto eseguite all’interno di una rete locale. Infatti richiamare tale url (o uno simile) da una normale connessione internet permette ad eventuali malintenzionati di eseguire lo sniffing sia della chiamata che della risposta esponendo il vostro database ad attacchi  per SQL Injection.

In alternativa, creando delle virtual directories su IIS è possibile memorizzare dei template contenenti le query e richiamare questi ultimi nascondendone la struttura. La query precedente può essere memorizzata, quindi in un file XML, denominato ad esempio template.xml secondo la seguente struttura:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:query> SELECT * FROM CATCLI FOR XML AUTO </sql:query> </ROOT> 

L’URL di chiamata diviene quindi:

http://IISServer/nwind/TemplateVirtualName/template.xml

Dove TemplateVirtualName è il nome della directory virtuale creata su IIS.

La struttura dell’XML risultante sarà la seguente:

<root>
 <CATCLI ID='1' DESCRIZIONE='PRIVATO' />
 <CATCLI ID='2' DESCRIZIONE='GROSSISTA' />
 <CATCLI ID='3' DESCRIZIONE='DETTAGLIANTE' />
</root>

Ma come appare il codice da parte dell’applicazione IOS? Supponendo di adoperare il primo stile di chiamata, e di aver predisposto una classe atta ad interpretare l’XML soprastante denominata XMLCatCli la funzione da adoperare è la seguente:

-(void) caricaCatCli{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSError *parseError = nil;

    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

    XMLCatCli *streamingParser = [[XMLCatCli alloc] init];
    [streamingParser parseXMLFileAtURL:[NSURL URLWithString:@"http://IISServer/nwind?sql=SELECT+*+FROM+CATCLI+FOR+XML+AUTO&root=root"] parseError:&parseError];
    [streamingParser release];        
    [pool release];

    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

Questo metodo, come accennato in precedenza, permette di accedere ad un database MSSQL remoto in modo quasi diretto. L’accesso alla risorse può avvenire in diversi modi, oltre che con chiamate di tipo REST GET, è possibile adoperare servizi SOAP, o anche query XPath, la flessibilità è quindi notevole. Adoperando poi oggetti tipici degli RDBMS come i TRIGGER e le STORE PROCEDURE è possibile eseguire anche elaborazioni complesse sui dati prima di restituire i risultati al chiamante.

La cosa interessante di questa soluzione è la sua portabilità, è infatti possibile adottarla sia su iOS che su Android, che su Windows Phone, che su altri dispositivi mobile, riducendo al minimo l’impatto sul codice lato server (limitato alla scrittura delle query per i templates).

Per approfondire l’argomento, comprese anche le varie modalità di interrogazione e l’installazione del modulo SQLXML potete partire da questo link.

Arrivederci al prossimo suggerimento,

Roberto S.

 



Related Posts Plugin for WordPress, Blogger...

Questa voce è stata pubblicata in iOS Tips e contrassegnata con , , , , , , , , . Contrassegna il permalink.
Wordpress Code Snippet by Allan Collins