Lo strumento dei Delegate nell'accesso alle basi di dati

In questo articolo spiegheremo step by step con Visual Studio 2015 Community Edition la creazione di un progetto Windows Form Application che eseguirà un processo di lettura di un Dataset corposo di record.

Iniziamo con l'aprire Visual Studio e creare un progetto Windows Form Application chiamandolo LetturaDataSet:



confermiamo con il pulsante Ok la creazione di questo progetto ed attendiamo che appaia l'ambiente di designer dell'applicazione. Ecco la finestra Esplora Soluzione:



aggiungiamo al progetto una classe denominata ReadDataSet, aggiornando la finestra esplora soluzione attraverso questi passaggi intermedi:

  • clicchiamo con il tasto destro del mouse sul progetto ed aggiungiamo dal menu contestuale un nuovo elemento
  • si aprirà una finestra di dialogo dalla quale scegliere un modulo di classe
  • nominare questo modulo ReadDataSet.cs





Esploriamo il modulo di classe aggiunto aggiornando i due namespace utili per:

  • System.Data.SqlClient - namespace per connetterci ad una base dati di SQL Server
  • System.Data - namespace per gestire la creazione del DataSet per mezzo della classe Adapter




in testa al codice abbiamo aggiunto due direttive Using in c# per utilizzare questi due namespace. Qual è il codice che dovremmo implementare? Rispondiamo a questa domanda esaminando quest'altro screenshot:



in questo snippet-code praticamente è stata creata una funzione che restituisce un DataSet attraverso questi passaggi:

  • Istanza alla classe SqlConnection passando come argomento la stringa di connessione
  • Istanza alla classe SqlCommand passando l'istruzione SQL Select ed associando la connessione attiva per mezzo della proprietà di tipo SqlConnection
  • Istanza alla classe SqlDataAdapter impostando la proprietà SelectCommand di tipo SqlCommand con l'oggetto ottenuto dal passo al punto precedente
  • Istanza alla classe DataSet ed invocando il metodo Fill dell'oggetto SqlDataAdapter ottenuto al punto precedente. In questo modo il DataSet si carica dei record ottenuto dall'esecuzione dell'istruzione SQL Select configurata con la classe SqlCommand

Aggiorniamo il codice della classe descritta con la dichiarazione di una funzione delegate, che alla fine restituirà un oggetto DataSet.



Evidenziamo a tal proposito il significato tecnico di questo termine. I delegate sono descritti dalla manualistica come puntatori ad una funzione. Quando questo delegate sarà utilizzato nel codice sarà praticamente chiamanto un metodo, il quale dovrà rispettare la stessa firma, come vedremo successivamente nel corso di questo articolo-tutorial.

Adesso possiamo descrivere con lo screenshot seguente l'interfaccia grafica composta dai seguenti controlli:

  • Controllo Button dall'etichetta QUERY DB
  • Controllo label per rappresentare lo stato dell'operazione
  • Controllo DataGridview per mostrare l'origine dati rappresentata dal DataSet




Ci resta da descrivere la routine evento associata al pulsante di comando (Evento Click):

si inizializza la classe DataSet:

  • si memorizza nella variabile connessione la stringa di connessione archiviata nel file App.Config
  • si inizializza il metodo Delegate AsyncTestMethodCaller passando come argomento il metodo della classe inizializzata TestMethod
  • la funzione Delegate configurata al punto precedente espone l'interfaccia IAsyncResult e per cui scriveremo IAsyncResult result=caller.BeginInvoke(connessione,out dtp,null,null)

Il metodo BeginInvoke del delegate istanziato esporrà tutti gli argomenti del metodo TestMethod della classe ReadDataSet. Questi argomenti saranno nell'ordine la stringa di connessione (connessione), il dataset che restituirà (vedasi l'utilizzo della clausola out). Gli altri argomenti di tipo Null riguardano appunto il riferimento alla funzione di CallBack mancante ed al parametro Object che rappresenta l'AsyncState.

Viene eseguito un cliclo che attenderà se l'azione collegata al metodo 'TestMethod' non giunga a completamento:

  • si renderà visibile il controllo Label1 dove verrà memorizzata la data di inizio processo
  • poi si stopperà temporaneamente il processo per una frazione di millisecondi avvantaggiandoci che tutto il DataSet si riempia dei records estratti dall'istruzione SQL Select definita con la classe SqlCommand

Terminato il processo si eseguiranno tutte le azioni definite nel blocco if result.IsCompleted:


quando nel corso dell'esecuzione del codice il test definito come condizione del blocco if andrà a buon fine le altre istruzioni definite saranno:

  • si invocherà il metodo EndInvoke della funzione delegate definita all'interno della classe ReadDataSet. A questo metodo verrà passato l'argomento dtp (DataSet) preceduto dalla parola riservata out e poi l'argomento result già definito nelle righe precedenti di codice
  • si eseguirà il il DataBinding della sorgente dati ottenuta (dataset) con il controllo DataGridView per mezzo della proprietà DataSource
  • si aggiornerà lo stato di fine processo per mezzo del controllo etichetta Label1

Ecco l'output finale, dove vedremo il riempimento del controllo DataGridView per mezzo dell'ottenimento del DataSet dall'esecuzione del metodo TestMethod per mezzo di una funzione Delegate definita:



Quest'ultimo screenshot termina anche quest'articolo.
Abbiamo compreso come definire dei Delegate si possano eseguire dei processi long run, in questa fattispecie viene eseguita una query di selezione eseguita con le classi Ado.Net che popolano un DataSet.


Attraverso i metodo BeginInvoke ed EndInvoke si può iniziare e terminare il processo deifnito con i Delegate con l'ottenimento di un risultato. In più abbiamo inserito due istruzioni che segnano l'inizio e la fine del processo per mezzo della funzione Now della classe DateAndTime.

Alternative a questo modo di approcciare avremmo potuto averle con l'applicazione di un controllo denominato BackGroundWorker, per il quale si potrebbe pianificare l'uscita di un nuovo articolo che ne spiega nei dettagli le sue funzioni e semmai utilizzare un controllo associato (la progress bar) al fine di stabilire l'avanzamento del processo stesso implementato.

Alla prossima con nuovi articoli su questo tema.

Commenti

Lascia una Risposta
captcha