Newsgroup: it.comp.lang.visual-basic
Titolo: Cursori e Paginazione (ADO)

Ciao a tutti,
avrei bisogno di un chiarimento.
Ho un'applicazione che deve effettuare delle ricerche in un
DB catalografico di medie dimensioni (c.a 350.000 record) e
riporre i risultati in una listview.
L'applicazione deve funzionare sia in rete locale che con
interrogazioni da remoto. Quando effettuo una ricerca i
risultati possono anche essere consistenti (ad esempio 6000
record) ed il relativo peso dei dati non proprio
trascurabile (il recordset salvato occupa 750Kb).
L'accesso può essere effettuato anche da decine di client,
il traffico generato può essere quindi molto grosso. A
questo punto pensavo di paginare i risultati, dato che
l'utente non se ne fa nulla di 6000 record (quando va bene)
tutti in una volta.
L'intoppo che ho trovato è che i cursori lato server, non
supportano la "paginazione" o quanto meno io non sono
riuscito a cavarci un ragno dal buco.
Ma se utilizzo i cursori lato client i dati mi engono
copiati sulla macchina e a quel punto non me faccio più
nulla della paginazione dato che i record sono già
transitati.
Sto sbagliando qualcosa? Suggerimenti?
Grazie a tutti.
Stefano

 transitati.
Per fare la suddivisione in blocchi di resultset hai 2 strade :
1) Prelevare il recordset di tutta la tabella (magari con clausola TOP) e
visualizzare solo i dati che ti interessano (dalla riga 50 alla 100 per
esempio)
2) Prelevare un recordset che corrisponda ai dati da visualizzare
La prima è la più semplice ma più dispendiosa in termini di  tempo ed
occupazione di  rete .
La seconda è più complicata (si tratta di subquery a tre livelli) ma fai
lavorare il DB (ed è il suo lavoro) per cui hai un complessivo, di tempi di
risposta, migliori ...
A meno che tu non debba lavorare sui dati con operazioni particolari (che
implicano lo scorrimento del recordset avanti indietro ecc) usa i cursori
che meno occupano risorse (forward only - read only) ...
il cursori client statico è uno snapshot (evoluto) dei dati sul server ...
una copia dei dati insomma ...
poi va molto a gusti , ma per le tue esigenze e condizioni di DB devi
calibrare bene l'utilizzo di questi ultimi ...
Se sei interessato ai dettagli chiedi pure ...
se non sbaglio Lupo è un "patito" delle ottimizzazioni ... spero che
intervenga, perchè mi pare che l'argomento non sia mai stato trattato nei
dettagli (magari mi sbaglio).
Saluti

 nei dettagli (magari mi sbaglio).
Intervengo, ma senza alcun contributo: Ho visto le paginazioni solo con ADO
e ASP, uso ADO solo per SQL Server e non ho mai approfondito, perchč,
usando, nello stesso applicativo, DAO per Access, mi costringerebbe a
cambiare e differenziare la logica, cosa che DAO non sopporterebbe perchč,
che io sappia, non prevede la paginazione.
Quello che faccio č semplicemente questo: Fermo restando che una griglia
dovrebbe ridurre al minimo le informazioni recuperate dal database (ma, lo
sappiamo, č inutile negarlo, l'operatore pigro spesso e volentieri dice
"voglio tutti gli articoli" e poi scorre a suo piacimento), compongo
l'intero recordset che soddisfa le condizioni (tante, poche o assenti), ma
lo espongo a "blocchi" di righe (parametrizzabile, ma di default 60), in
modo da ridurre al minimo i tempi di formattazione e di composizione di
righe e colonne. Chiaramente l'operatore puň spostarsi in su e in giů anche
con la tastiera (ecco perchč spesso dico che la MsFlexGrid non mi sta bene e
uso la vecchia Grid32.OCX, perchč quest'ultima sente i tasti di spostamento,
frecce, anche quando ci si trova a inizio o fine griglia, ma Flex no, la
HFlex, sě, ma non sono riuscito ad usarla...) e in quel caso carico (in
griglia, il recordset, come dicevo, č completo) il "blocco" precedente o
seguente con la sola attesa della composizione della griglia stessa, fatta
di poche righe.

Sto sbagliando qualcosa? Suggerimenti?
Premetto che non ho effettuato delle prove.
Hai già dato un'occhiata al link seguente?
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdproabpagex.asp
Nell'esempio cmq viene usato un cursore lato client.
Probabilmente bisogna impostare anche la prop. CacheSize.
Ciao!

Ciao,
si, l'articolo l'avevo già visto ed anche provato.
Grazie.
Stefano
"ErPotenza" <no....@thank.you> ha scritto nel messaggio
news:abtg4011nqbc7ib4q...@4ax.com...


 Probabilmente bisogna impostare anche la prop. CacheSize.
L'help specifica che l'absolutepage e l'absoluteposition sono meccanismi
uguali ...
l'absoluteposition forza il caching (anche se il record  puntato è già in
cache) ... se funziona così anche l'absolutepage, meglio impostare il
cachsize a 1, cosicchè ad ogni cambio pagina, il recaching agirà solo per un
solo record.
Ogni volta che viene aperto un cursore statico lato client, tutti i dati che
soddisfano la query vengono copiati sul client; la paginazione in tal caso
non è di particolare aiuto (anche se fa risparmiare scrittura di codice) ...
diverso sarebbe se il cursore fosse sul server, in quanto i dati che il
client legge sono quelli che vengono passati dalla cache (e quella è sempre
locale al client). Con cursori dinamici o firehose  l'assegnamento di un
progressivo di posizione non è pensabile in quanti i dati potrebbero venire
aggiornati in qualsiasi momento e quello che prima stava su una pagina
potrebbe finire su un'altra.
In rete non ho trovato molta documentazione .. mi sembra che 
ado.net
 abbia
risolto un po' di questi problemi ma secondo me le cose andrebbero risolte
sul DB .. ma su questo c'è molto da dibattere.
Saluti