Willino Blog

Sono un ingegnere informatico, appassionato di fotografia, chitarra acustica, micologia e Tennis Tavolo. In questo blog cercherò di raccontare eventi ed esperienze che in qualche modo potrebbero risultare utili a tutti.

martedì 21 aprile 2009

Esecuzione di comandi WSQL

Questa guida di riferimento è indirizzata agli sviluppatori WY

L'esecuzione di un comando SQL/WSQL compilato con il metodo discusso nella Guida di riferimento per la creazione di comandi SQL da codice Delphi, come da esempio seguente :

• Esempio Object Pascal
SqlCMD.BuildSQL('Descrizione comando sql');
Compilazione del comando SQL/WSQL

La richiesta di esecuzione del comando può avvenire in due metodi differenti. Il primo metodo di esecuzione non ritorna un cursore al comando ed è adatto per comando DML (manipolazione dei dati) e DDL (definizione dello schema), mentre il secondo metodo ritorna un cursore alle righe restituite dall'esecuzione del comando. questo fa comprendere che il metodo di esecuzione va scelto a priori in funzione del comando. Vedremo per primo il metodo di esecuzione che non ritorna cursori, come in questo caso :

• Esempio Object Pascal
  1.With WYDM, WYDM.SQLServices Do
2.Begin
3. TransactionStart;
4. Try
5. ExecuteSQL(SqlCMD.BuildSQL('Descrizione'), stWithSQL);
6. TransactionCommit;
7. Except
8. TransactionRollBack;
9. End;
10.End;
Esecuzione di un comando SQL/WSQL che non ritorna cursori (utile per INSERT,UPDATE,DELETE)

Il metodo che esegue il comando è ExecuteSQL appartenente a WYDM, il modulo dati dell'applicazione. In ingresso questo metodo si aspetta il comando SQL compilato (restituito da BuildSQL) e la modalità di gestione del comando che può essere :

  1. stWithSQL, per comandi DML
  2. stWithPSQL, per comandi DDL

Vediamo ora il caso più completo che, invece, esegue il comando ritornando un cursore molto semplice e potente da utilizzare.

• Esempio Object Pascal
  1.Var
2. lRow : TWYDataset;
3.Begin
4. lRow := WYDM.CreateFetchableDataset;
5. Try
6. With WYDM, WYDM.SQLServices Do
7. Begin
8. SqlCMD.Clear;
9. SqlCMD.Sql.Add('SELECT * FROM WY_ALIAS');
10. SqlCMD.Sql.Add(' WHERE IDALIAS=?1?');
11. SqlCMD.AV(aAlias);
12. If ExecuteSQL(SqlCMD.BuildSql('Recupero Alias'),'IDALIAS', lRow, flMultiTone) <> '' Then
13. Begin
14. While FetchRow(lRow, flMultiTone) Do
15. Begin
16. lRow.Row.FieldByName('TIPOLOGIA_ALIAS').AsInteger;
17. End;
18. End;
19. End;
20. Finally
21. WYDM.FreeFetchableDataset(lRow);
22. End;
23.End;
Esecuzione di un comando SQL/WSQL che ritorna un cursore al dataset (utile per SELECT)

Esaminiamo il codice.

Le righe da 8 a 11 dovrebbero ormai essere chiare, mentre sono di nostro interesse le righe 4,12,14,16 e 21.

La riga 4 inizializza il cursore lRow e lo predispone per ricevere il dataset. Uno dei punti forti di WY è la gestione completamente offline dei dataset pertanto, una volta eseguito il nostro comando, il cursore lRow conterrà il dataset in memoria e le risorse per l'esecuzione del comando SQL/WSQL saranno già tutte rilasciate. Vedremo quindi più avanti tutte le caratteristiche del cursore TWYDataset.

La riga 12 esegue il comando. Il metodo si aspetta il comando SQL compilato, il nome di una colonna chiave, il cursore e la modalita di gestione del cursore stesso. Concentriamoci sull'ultimo parametro, che può assumere due valori :

  1. flSingleTone
  2. flMultiTone

Nel primo caso ci si aspetta il ritorno di una sola riga (quindi per le query singletone), mentre nel secondo ci si aspetta un dataset. A prescindere dalle righe ritornate, il cursore lRow punterà alla prima riga del dataset in memoria.

Ciò che ora ci interessa è accedere ai valori della riga corrente nel dataset, e poter scorrere il dataset stesso.

L'accesso ai dati della riga corrente avviene come in un qualsiasi dataset derivato da TDataset che, nel nostro cursore, è puntato dall'attributo Row del cursore lRow, come descritto nella riga 16 dell'esempio precedente e qui di seguito generalizzato :

• Esempio Object Pascal
lRow.Row.FieldByName('COLONNA_INTERO').AsInteger;
Lettura di un valore di una riga del cursore

Per scorrere invece il dataset in memoria tramite il cursore consideriamo la riga 14 dell'esempio precedente, qui generalizzato :

• Esempio Object Pascal
While FetchRow(lRow, flMultiTone) Do
Ciclo di fetch per il cursore ottenuto dall'esecuzione del comando

Non è necessario aprire o chiudere i cursori lRow in quanto sarà compito dell'oggetto WYDM gestire il flusso. La differenza con l'approccio classico di gestione dei dataset sta proprio nel fatto che l'apertura e la chiusura, i controlli di esistenza e altro vengono svolti dall'oggetto WYDM in modo trasparente.

La riga 21 dell'esempio precedente rilascia le risorse di memoria allocate dal cursore lRow.

E' infine possibile eseguire il comando per leggere il valore di una sola colonna in una query singletone con il seguente metodo :

• Esempio Object Pascal
lString:=ExecuteSQL(SqlCMD.BuildSql('Descrizione'), 'NOME_COLONNA');
Esecuzione di un comando SQL/WSQL per leggere il valore di una sola colonna

Nessun commento:

ANSA.it - Top News