Newsgroup: it.comp.lang.visual-basic
Titolo: [ADO] Caricamento dei record lento

CIao a tutti,
Sapreste spiegarmi perchè, un set di circa 27700 record, per essere caricato 
in una DataGrid connessa ad un ADODB
apparentemente sembra eterno? Ci mette parecchi secondi (almeno 5) e nel 
lasso di tempo la schermata resta vuota ...difatti sto pensando di inserire 
una finestra di compendio per ingannare l'attesa...
Pensavo di paginare i dati a blocchi di record con PageSize, ma il controllo 
DataGrid non lo consente, carica tutto insieme.
Grazie per eventuali consigli
Emanuele (To)

Emanuele ha spiegato il 19/08/2005 :

Già il fatto di mettere 27000 record in una datagrid, è discutibile. Ma 
non entro nel merito, magari le hai provate tutte e questa è l'unica 
soluzione.
Per quanto riguarda la visualizzazione, potresti connettere il datagrid 
ad un oggetto recordset, anzichè ad un AdoDataControl (immagino che 
ADODB sia un errore di digitazione, ma che tu intendessi ADODC). 
L'apertura del recordset può quindi essere fatta in modalità asincrona, 
forzando un refresh del datagrid ad ogni pagina ricevuta.
Ciao
Alberto
-- 
Autore di
"Petting for Dummies"

 forzando un refresh del datagrid ad ogni pagina ricevuta.
Il problema e che non so come effettuare la paginazione dato che il DataGrid 
riceve tutti i record contemporaneamente...il problema è proprio li. Se 
riuscissi a far spezzettare in pagine i record, mica avrei problemi di 
lentezza.
Comunque grazie dei consigli Alberto
Emanuele 

Non credo che esistano metodi "più furbi" o tecnologie che ti consentano di 
azzerare il tempo che devi attendere per caricare tutti i dati in una 
datagrid.
Mi spiego meglio, nella migliore delle ipotesi potresti al massimo trovare 
un meccanismo, un algoritmo che ti farà guadagnare un pò di tempo nel 
recupero dei dati e nel popolamento della datagrid ma che non risolverà mai 
definitivamente il problema, in definitiva è come nascondere la spazzatura 
sotto il tappeto.
A mio avviso il problema non sta nel guadagnare del tempo ma di riuscire a 
comprendere che caricare anche soli 5.000 records in una datagrid è uno 
spreco di risorse.
Fai transitare 27.000 records e più hai detto perchè l'utente li possa 
guardare ? (faccio questo mestiere da molti anni, non conosco nessun 
operatore in grado di guardarsi tutti quei dati e di gestirli anche in una 
sola volta).
Quindi in definitiva queste sono le mie proposte:
1) si caricano pochi dati negli oggetti, al massimo 1000 righe filtrate
2) si inserisce un bel filtro sull'estrazione di dati l'operatore 
richiamando le forms con i fitlri può decidere di rimuovere tutti i filtri e 
quindi di aspettare pazientemente  (avvisare il cliente che ci saranno tempi 
morti o improduttivi)
3) Nella progettazione delle forms fare in modo che una volta è stato 
acquisito un codice questo si possa utilizzare per "navigare" su tutti i 
records collegati filtrando comunque quelli che potrebbero risultare troppo 
numerosi.
4) l'operatore "sa" che cosa vuole vedere, sia sempre lui a decidere quali e 
quanti dati vedere.
5) se devi fare degli aggiornamenti su una collezione di dati (a volte 
capita) fai una "sql update"
-- 
-----------------------------------------------------------------
Bastianello Luciano
Software Consultant - Apprentice Sorcerer
MBS CP Development
MSN: 
cte...@hotmail.com
 - ICQ: 209754422
http://community.visual-basic.it/LucianoB/
-----------------------------------------------------------------


 lentezza.
Eh?????
Scusa, ti ho detto "l'apertura del recordset può essere fatta in 
modalità asincrona".
Hai guardato l'help del metodo Open?
O ti piace contestare per fare il figo?


[cut]
Scusate, scusate, solo ora mi rendo conto leggendo i vostri due post, che 
forse non mi sono spiegato a dovere.
Ovviamente, il cliente non è un Superman o un Data della situazione, ma 
semplicemente, la datagrid in questione, contiene tutti i record relativi al 
m agazzino articoli, in ordine alfabetico....
Ovviamente, l'utente può scandagliare in base a qualsiasi parametro (con un 
"cerca" creato ad hoc), ordinarli secondo qualsiasi campo presente nel 
database ecc ecc.....pero mi resta il fatto che lui li abbia tutti a 
disposizione, non li debba cercare, non debba inventarsi ricerche o artefizi 
strani....ha tutti gli articoli caricati e visibili subito.
Ora, il mio problema era il seguente....Come poter pagina degli articoli 
(usando ADODB) e farglieli vedere nel datagrid?
Io ho provato a fare come faccio solitamente in internet quando devo far 
vedere una porzione di magazzino diciamo 30 articoli per pagina, cioè ho 
cercato di sfruttare il PageSize e il PageCount.
Pero con questo sistema, non sono riuscito nel caso del datagrid, perche una 
volta agganciato il DataGrid alla connessione ADODB e abbinato
DataGrid.DataSource = AdoRec
(dove AdoRec è il recordset caricato con la libreria Adodb), questo mi 
visualizza tutti i record....ho provato anche a leggere solo una porzione di 
recordset, ma non ha funzionato.
Grazie a entrambi
Emanuele 

 ha scritto nel messaggio 
news:Ic2Oe.24123$F23.2...@twister2.libero.it...

Se non ho capito male ... basterebbe fare una paginazione con query sql ( un 
bel select top ... ) e passarla al datasourcr del datagrid.
sempre se il mio unico neurone ha funzionato a dovere puoi vedere un esempio 
di come costruire la query al link :
http://blogs.aspitalia.com/rickyvr/post782/GestirePaginazioneDatiSQLServer.aspx
 

... dimenticavo ( l'unico neurone perde colpi ..azz ) se la fonte dati e un 
database MySql ad esempio puoi anche usare una query con l'istruzione LIMIT
 Ammettiamo di voler estrarre 20 records per pagina, la query dovrebbe 
essere:
SELECT * FROM dati LIMIT 1,20
Per la prima pagina, ma poi per la seconda sarà:
SELECT * FROM dati LIMIT 21,20
E per la terza:
SELECT * FROM dati LIMIT 41,20
Ciao. 

 caricati e visibili subito.
Cosa che non serve praticamente a nulla.
E' come se si volesse consultare l'elenco telefonico abbonati, caricando 
TUTTI i nominativi anzichè filtrando per 'Città->nome' o per 
'Città->Categoria->Ristoranti' (ad esempio).
Dato che caricare 27.000 e più record in una griglia non ha senso, 
inducendo l'utente ad un uso 'errato' (IMHO) dell'applicazione, è bene 
partire da una form contenente una griglia vuota e una serie di 
textbox/combobox per eseguire una ricerca mirata.
Nulla ti vieta di mettere anche un pulsante 'Mostra tutti'... in tal caso 
è l'utente che 'forzatamente' dirà all'applicazione di caricare i 27.000 
articoli.
Nel caso che in cui tu non sia convinto, puoi fare questa prova: metti 
all'interno della tua applicazione un po' di codice per fare logging 
dell'uso della stessa.
Potrai rilevare 2 tipi di comportamento.
1) L'utente, dopo aver aperto il form "articoli" (ed aver aspettato tot 
secondi per il caricamento dello stesso) eseguira' un filtro sugli stessi 
per cercare più facilmente l'articolo interessato...
2) L'utente, dopo aver aperto il form "articoli" (ed aver aspettato tot 
secondi per il caricamento dello stesso) scrollera' inutilmente la griglia 
alla ricerca dell'articolo (spendendo ulteriore tempo) e alla fine, 
eseguira' un filtro sugli stessi per cercare più facilmente l'articolo 
interessato...
Pertanto:
1) Lasci tutto così come è, e l'utente aspetta il tempo che c'è da 
aspettare...
2) Educhi l'utente ad un uso più proficuo ed intelligente 
dell'applicazione.
Ciao
-- 
Gianluca Cannalire
Microsoft MVP/MCP - Visual Basic
http://www.visual-basic.it
http://community.visual-basic.it/gianluca

 (usando ADODB) e farglieli vedere nel datagrid?
Usando l'apertura asincrona, hai la gestibilità del form 
immediatamente, mentre il recordset si popola.
Non ricordo poi se il datagrid supporta l'aggiunta dei record una volta 
visibile (ma credo pro


 recordset, ma non ha funzionato.
Che errore ti ha dato?
Te lo chiedo, perchè ti ho già detto di usare l'apertura asincrona, io 
la uso regolarmente nei rari casi in cui sono obbligato a popolare le 
DataGrid molto numerose, e ottengo una visualizzazione istantanea dei 
primi record, il controllo all'utente fin dall'inizio, anche mentre lo 
streaming dei dati è ancora in corso.
Ho fatto una banale prova con circa 700.000 record, mettendo in codice 
ciò che ti ho detto prima, e funziona perfettamente.
Griglia popolata istantaneamente con la prima paginata, e controllo 
all'utente mentre i restanti record vengono caricati.
Oppure, ho completamente travisao il tuo quesito iniziale.


AAAAAAAAAAAAAAAAAAAAAAAHHHHHHHHHHHHH!!!!!!!!!!!!!!!!!!!!!!!!!1
FERMO FERMO FERMO......quello che dici mi sollazza parecchio...e proprio 
quello che io vorrei fare...vorrei che la form con il datagrid e una prima 
trance dei dati fosse visualizzata immediatamente, poi dei restanti 
xmigliaia me ne frego..anche dopo...
Nessun errore, solo molta lentezza.
Emanuele.


 me ne frego..anche dopo...
Ok, ma perchè ti sollazza adesso, mentre 48 ore fa hai detto che non 
era ciò che ti serviva?
Boh, certe volte ho l'impressione che qualcosa non quadri, nel mio modo 
di esprimermi...


 xmigliaia me ne frego..anche dopo...
Forse devi mettere da qualche parte, nel metodo open, adAsyncFetch. Vedi 
se IntelliSense ti aiuta...
-- 
Emanuele Torrenti

 Alberto
Chiedo scusa, ma forse sono io che non ho capito quello che mi avevi 
detto...
abbi pazienza, ma senza ferie (e senza soldi) dopo un po mi distraggo
Grazie
Emanuele