Home Page Home Page Articoli Usare degli indicatori di progresso con Query SQL

Usare degli indicatori di progresso con Query SQL

Nell'articolo vediamo come sia possibile con un l'aiuto delle classi DataReader e Command di ADO.NET, mostrare un indicatore di progresso che indichi lo stato di avanzamento di una query SQL durante il fetching dei dati.
Autore: Matteo Raumer Livello:
Una delle cose di cui non possono fare a meno i programi, sono sicuramente le barre di progressione.
Durante le operazioni piu' costose in termini di tempo, qualunque programma ben fatto ha obbligatoriamente una barra di progressione che avanzando fa aspettare piu' volentieri ed eventualmente invoglia a fare qualcosa d'altro per tornare più tardi. Vediamo qui di seguito la screenshot del programma che andremo a scrivere:

Il programma in esecuzione
Il programma in esecuzione


Tutto questo si può fare agevolmente (anzi si deve fare!) nei cicli, dove si conteggia a priori il numero esatto di loop e poi si incrementa la progressione.
Purtroppo però volte non sempre è facile sapere quanti passaggi si faranno, come nel caso di query dove non si piò sapere in anticipo il numero di righe ritornate.in questo caso percio' spesso si tende a far eseguire la query e aspettare il risultato, magari mettendo l'icona del cursore con la clessidra, cosa che mediamente può andar bene ma nel caso di moltissimi dati da lo spiacevole effetto "inchiodato".
A questo inconveniente si può ovviare facendo una query preventiva per farsi dare il conteggio delle righe che andremmo a prelevare per poi prelevarle effettivamente con la classe #DataReader (# sta per oledb,sql etc..).
La classe #DataReader ci per mette di leggere i dati riga per riga con il metodo 'Read' che sposta il puntatore al record successivo.
Basterà girare per ogni colonna della riga e farsi dare il valore della cella per creare una tabella come risultato della query.
Ma piu' precisamente:

Innanzitutto si devono preparare gli oggetti base ado.net per accedere ed eseguire query su database e cioè un command per le query, una connessione e ovviamente un reader:


System.Data.SqlClient.SqlConnection cn = new System.Data.SqlClient.SqlConnection(@"data source=(local)\netsdk;initial catalog=northwind;persist security info=False;user id=sa");
System.Data.SqlClient.SqlDataReader zRd;
System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand("",cn);

cn.Open();


Facciamo una query in più di quella effettiva che dia il conteggio (quindi un numero) delle righe prima di leggerle.
Lo standard sql ci viene in aiuto, infatti basta anteporre "select count(*) from " alla %miaquery% in questo modo:


cmd.CommandText = "select count(*) from (%miaquery%) as tbl";


ed ottimizzare chiamando ExecuteScalar che ritorna un valore unico senza creare tabelle:


progressBar1.Maximum = (System.Int32)cmd.ExecuteScalar();
progressBar1.Value =0;



adesso disponiamo del conteggio delle righe che ci ritornerà la %miaquery% quindi riutilizziamo il command pereseguire quest'ultima facendoci tornare un Reader per "scorrere" i dati.
In più ci salviamo il conteggio delle colonne (dato che dovremmo girare su ogni cella è meglio parcheggiarlo su una variabile) :


cmd.CommandText = %miaquery%;
zRd = cmd.ExecuteReader();
int zCount = zRd.FieldCount;


adesso abbiamo tutto quello che serve per creare una tabella con i dati, per prima cosa creiamo lo schema delle colonne:


DataTable zDt = new DataTable("miaTabella");
for(int i = 0 ; i < zCount; i++)
{
zDt.Columns.Add(zRd.GetName(i), zRd.GetFieldType(i));
}


e poi la riempiamo:


while(zRd.Read())
{
DataRow zdr = zDt.NewRow();
for(int i = 0 ; i < zCount; i++)
{
zdr = zRd.GetValue(i);
}
zDt.Rows.Add(zdr);
progressBar1.Value += 1;
}


Utilizzando il Reader dobbiamo ricordarci di chiudere la connessione (altrimenti rimane aperta con uno spreco di risorse) e po possiamo agganciare alla griglia la tabella completa:


cn.Close();
dg.DataSource = zDt;



Nel caso dell'esempio si incrementa ad ogni nuova riga ma è possibile essere più precisi incrementando nel ciclo interno (per ogni cella) e quindi il max della progressbar sara = nRighe * NColonne

Pro:
Fa aspettare "più volentieri" il risultato di interrogazioni pesanti

Contro:
Funziona solo con database che supportano le subquery come Access, Sql e Mysql (versione 4.1 in poi).
Si raddoppia il numero delle query, anche se una delle 2 è minima fa sempre lavorare il database.
Non si utilizza un #DataAdapter che torna utile per aggiornare i dati dopo eventuali modifiche.
Voto medio articolo: 2.6 Numero Voti: 9

File allegati


94_progquery.zip (24 Kbyte)
Matteo Raumer

Matteo Raumer

Laurea breve in Ingegneria Elettronica presso l'Universita di Padova nel 2001, e nel febbraio 2009 un'altra triennale in Ingegneria Informatica. Da anni lavoro come programmatore .NET principalmente in C#, per migrare applicativi win32 in applicazioni ASP.NET. Ho sviluppato inoltre parecchia reportistica su Cr... Profilo completo

Articoli collegati

Utilizzare NUnit per testare codice .NET
Scopriamo in questo articolo come utilizzare il popolare framework Open Source NUnit per effettuare Unit Testing del codice .NET aumentandone la qualità e riducendo il numero di eventuali bugs.
Autore: Michela Zangarelli | Difficoltà:
SQL Injection, che cosa è e come difendersi
I malintenzionati sono sempre dietro l'angolo. Il SQL Injection è una delle pratiche più semplici da utilizzare per attaccare un'applicazione poco sicura e violarla o arrecare danni al database. Vediamo che cos'è e come garantire la sicurezza delle applicazioni in modo adeguato.
Autore: Alessandro Alpi | Difficoltà: | Commenti: 4
Visual Studio 2005 Team System
Scopriamo il nuovo IDE di sviluppo che copre interamente l'intero ciclo di vita del software integrando in un solo ambiente più prodotti e studiato apposta per i ruoli di Architect, Developer e Tester.
Autore: Marco Caruso | Difficoltà: | Voto:
Tutorial ADO.NET ed esempi pratici - Parte 2
Dopo aver fatto un po' di teoria su ADO.NET nella Parte 1 dell'articolo procediamo con un Tutorial pratico che ci condurrà alla creazione di un'applicazione basilare che consenta l'accesso e la modifica dei dati su un Database Access.
Autore: Stefano Passatordi | Difficoltà: | Commenti: 10
Introduzione ad ADO.NET - Parte 1
ADO.NET è uno dei componenti chiave del .NET Framework. Eredita il nome dal vecchio ADO ma è praticamente quasi tutto cambiato. Una nuova architettura, nuovi concetti, nuove funzionalità e nuovi oggetti. Vediamo quali sono e a cosa servono.
Autore: Stefano Passatordi | Difficoltà: | Commenti: 6
Colonne calcolate e parola "Child" con ADO.NET
Una cosa utile di ADO.NET e' la possibilita di aggiungere ad una colonna da codice il cui valore sia il risultato di operazioni sui dati dei record (o tra valori di altre colonne). Quando si utilizza un dataset con piu tabelle collegate mediante relazioni invece, usando la parola chiave "child" si possono avere delle informazioni riguardanti le tabelle figlio, direttamente nei record della tabella
Autore: Matteo Raumer | Difficoltà: | Voto:
La crittografia e la classe Rijndael
Vediamo come utilizzare una delle tante classi messe a disposizione dal .NET Framework per la crittografia dei dati. In particolare la classe Rijndael implementa un algoritmo di crittografia molto forte diventato famoso negli ultimi anni.
Autore: David De Giacomi | Difficoltà:
DES il famoso standard creato da IBM per la crittografia dei dati
In questo articolo dimostreremo come crittografare dei file usando il .NET Framework e in particolare la classe DESCryptoServiceProvider che implementa l'ormai noto algoritmo di cifratura inventato da IBM negli anni 70 chiamato DES (Data Encryption Standard)
Autore: David De Giacomi | Difficoltà: | Commenti: 2 | Voto:
Cosa sono e come funzionano le funzioni ricorsive?
Ecco tre esempi efficaci che vi spiegano come usare correttamente le funzioni ricorsive, per effettuare ricerche di file e cartelle all'interno del disco fisso, per ricostruire la struttura di un file XML oppure per svuotare determinati controlli in una Form.
Autore: Matteo Raumer | Difficoltà: | Commenti: 2
Costruire Console Applications con Visual Studio .NET
Spiegheremo in questo articolo i passi base fondamentali per costruire Console Applications utilizzando Visual Studio .NET.
Autore: David De Giacomi | Difficoltà: | Voto:
TextReader e TextWriter
Una panoramica su come utilizzare queste due classi che ci permettono di leggere e scrivere file di testo.
Autore: David De Giacomi | Difficoltà: | Commenti: 1 | Voto:
Giochiamo un po' con il registro di Windows!
Scopriamo uno degli elementi fondamentali del sistema operativo Windows e vediamo come è possibile accedervi tramite le classi offerte dal .NET Framework: Microsoft.Win32.Registry e Microsoft.Win32.RegistryKey
Autore: David De Giacomi | Difficoltà: | Commenti: 1 | Voto:
.NET Framework 1.1 Beta
Una prima panormaica sulle novità offerte dal Framework 1.1 che sarà integrato nella prossima versione di Visual Studio .NET 2003.
Autore: David De Giacomi | Difficoltà:
Cosa posso costruire con Visual Studio .NET ?
Un' introduzione sui vari tipi di progetto disponibili in Visual Studio dalle tipiche applicazioni Windows fino alle recenti applicazioni Web e agli innovativi Web Services.
Autore: David De Giacomi | Difficoltà: | Commenti: 1
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5