Lentezza caricamento dati in datagrid

venerdì 08 marzo 2013 - 08.48
Tag Elenco Tags  VB.NET  |  .NET 3.5  |  Windows 7  |  Visual Studio Express  |  SQL Server 2008 R2

pieroalampi Profilo | Expert

salve, qualcuno mi sa dare qualche consiglio sull'aggiornamento di un datagridview? praticamente carico circa 300.000 linee nello stesso e ogni volta che ne aggiungo 1 la mia procedura effettua il refresh ricaricando tutto il db per intero nella griglia, esiste un metodo per far caricare solo le linee cambiate o aggiunte??
poi perche se popolo il datagridview da codice è più lento di quando lo carico adottando la procedura guidata (trascinamento del dataset sul form quindi.... binding navigator e tutto il resto)???
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LA PRIMA FRASE DI UN PROGRAMMATORE HELLO WORD ...... ANCHE L'ULTIMA

ridaria Profilo | Expert

>salve, qualcuno mi sa dare qualche consiglio sull'aggiornamento
>di un datagridview? praticamente carico circa 300.000 linee nello
>stesso e ogni volta che ne aggiungo 1 la mia procedura effettua
>il refresh ricaricando tutto il db per intero nella griglia,
>esiste un metodo per far caricare solo le linee cambiate o aggiunte??

Certo che sì.

Ad ogni aggiunta di un record non devi far altro che aggiungere alla griglia solo il record aggiunto e non, come mi sembra di capire, ricaricare l'intera griglia.

Aggiungi il record al db;
Aggiungi una riga alla griglia popolandola con i dati del record in questione. I dati del record aggiunto dovresti già tenerli in memoria dal momento che li hai appena aggiunti al db e quindi non devi leggere il db.

Per aggiungere una sola riga:
dataGridView1.Rows.Insert(indexRiga, 1)
e poi apopoli le celle della riga....
DataGridView1.Rows(indexRiga).Cells("codice").Value = codiceArticolo
DataGridView1.Rows(indexRiga).Cells("nome").Value = nome


CIAO


Riccardo D'Aria

pieroalampi Profilo | Expert

perfetto grazie mille ma il problema principale è che il popolamento della griglia proviene sopratutto con delle Inner Join in questo caso come dovrei fare???
qui un esempio della friglia
se dovessi aggiungere la sola riga senza considerare le inner join mi verrebbe popolata con gli indici del db e quindi sarebbe inconprensibirle, come fare????
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LA PRIMA FRASE DI UN PROGRAMMATORE HELLO WORD ...... ANCHE L'ULTIMA

ridaria Profilo | Expert

>perfetto grazie mille ma il problema principale è che il popolamento
>della griglia proviene sopratutto con delle Inner Join in questo
>caso come dovrei fare???
>qui un esempio della friglia
>se dovessi aggiungere la sola riga senza considerare le inner
>join mi verrebbe popolata con gli indici del db e quindi sarebbe
>inconprensibile, come fare????

Ok chiaro.

Dunque:
Quando salvi il nuovo record ti prendi l'id del record appena salvato, in modo che puoi riprenderlo con una select puntando all'id del record.

Fatto ciò non ti resta che eseguire la select con la inner join solo sul record che ti interessa (di cui ne hai l'id).
A questo punto hai il record e popoli la riga della griglia che hai aggiunto come ti ho detto al post precedente.

CIAO
Riccardo D'Aria

pieroalampi Profilo | Expert

ok mi sembra fili alla perfezione, quindi ovviamente la stessa cosa dovrebbe valere per le modifiche di altri record finisco una cosa provo e ritorno per ora grazie

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LA PRIMA FRASE DI UN PROGRAMMATORE HELLO WORD ...... ANCHE L'ULTIMA

pieroalampi Profilo | Expert

ecco il problema: la griglia io all'apertura del form la popolo e quindi è valorizzata, quando cerco di inserire una nuova riga mi dice che non è possibile come fare????
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LA PRIMA FRASE DI UN PROGRAMMATORE HELLO WORD ...... ANCHE L'ULTIMA

Vinsent Profilo | Senior Member

Nell' immagine dovresti togliere qualche riferimento...tipo il numero di telefono di Pierfrancesco...

ridaria Profilo | Expert

in che senso non è possibile che errore ti dà e che codice usi per fare l'aggiunta di una riga?

Riccardo D'Aria

pieroalampi Profilo | Expert

mi dice che perche la datagridview è associata a dati non è possibile inserire una riga a livello di codice, io ho fatto anche in modo diverso e cioè ho caticato i dati nel dataset e li in automatico la griglia mi dà i dati indietro, ma il problema è che la griglia è popolata con diverse inner join quindi la cosa non mi funziona e poi in ogni caso sono sempre sotto scacco perche a lungo andare anche il dataset si appesantisce, sicuramente meno del db per intero ma in ogni caso rimane pesante, la cosa ideale è quella che mi hai detto tu ma non riesco, ho utilizzato esattamente quello che mi hai inviato, ma in debug mi fermo gia alla prima istruzione dataGridView1.Rows.Insert(indexRiga, 1), con l'errore che ho scritto prima e cioè : Impossibile aggiungere righe a livello di codice alla raccolta di righe di DataGridView in caso di associazione a dati del controllo.
dataGridView1.Rows.Insert(indexRiga, 1)
'e poi apopoli le celle della riga....
DataGridView1.Rows(indexRiga).Cells("codice").Value = codiceArticolo
DataGridView1.Rows(indexRiga).Cells("nome").Value = nome


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LA PRIMA FRASE DI UN PROGRAMMATORE HELLO WORD ...... ANCHE L'ULTIMA

ridaria Profilo | Expert

questo perchè ci si fa prendere la mano dalle scorciatoie, e cioè dateset datatable etc....

Lavorare, per così dire a basso livello ti da maghgior controllo su tutto.

In questo caso se tu abbandoni il dataset e fai una select sul db con un data reader e poi cicli il datareader per popolare la griglia avresti la griglia sganciata dal dataset e quindi la possibilità di aggiungere righe a tuo piacimento.

Questo tipo di approccio, che io preferisco,Se è vero che è più lungo in fase di sviluppo, torna poi utile dopo in quanto come ho detto si ha maggior controllo sul codice e sugli oggetti.

CIAo

Fammi sapere



Riccardo D'Aria

pieroalampi Profilo | Expert

faccio una prova e ti dico vediamo se riesco, in ogni caso non ho trascinato il dataset sul form ma ho scritto tutto il codice! tu forse ti riferivi a questo?
ma per ciclare il tutto devo contare i campi del db vero? in questo saco devo creare un'altra routine con una select count per l'intero db o sbaglio?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LA PRIMA FRASE DI UN PROGRAMMATORE HELLO WORD ...... ANCHE L'ULTIMA

ridaria Profilo | Expert

>faccio una prova e ti dico vediamo se riesco, in ogni caso non
>ho trascinato il dataset sul form ma ho scritto tutto il codice!
>tu forse ti riferivi a questo?
>ma per ciclare il tutto devo contare i campi del db vero?

NO devi leggere i dati dal db con datareader (oggetto ado.net)
Poi non devi far null'altro che ciclarlo non hai bisogno di contare perchè l'oggetto datareader lo cicla da solo per intero. Appresso un esempio

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

In questo modo lovori senza datatable e la griglia non sarà agganciata al datable


FAmmi sapere
Riccardo D'Aria

pieroalampi Profilo | Expert

in ogni caso mi sei stato molto utile grazie per il tempo
si era più o meno quello che però in forma diversa avevo fatto io, ma ho trovato i seguenti problemi
1 se ricarico la griglia devo prima impostare il datamember su nothing altrimenti mi raddoppia i campi ad ogni load del db
2 la velocità!! veramente non so ma a me sembra molto più lento del metodo con dataset o mi sbaglio????

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LA PRIMA FRASE DI UN PROGRAMMATORE HELLO WORD ...... ANCHE L'ULTIMA

ridaria Profilo | Expert

credo che sia un pò più lento, ma come tutte le cose hanno sempre l'altra faccia della medaglia.

Nel tuo caso era necessario poter aggiungere righe alla griglia e quindi èra necessario sganciare la griglia dal dataset.


CIAO
Riccardo D'Aria

pieroalampi Profilo | Expert

si si infatti ala fine ho capito un'altra cosa, e questo va benissimo per il mio sw credo che lascierò invariato il tutto anche perché è proprio la velocità che mi interessa e a dire il vero a volte vedo software con db giganteschi che vanno a palla sicuramente sarà per come è stato razionalizzato e il resto anche l'hw fa la sua parte grazie mille ancora
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LA PRIMA FRASE DI UN PROGRAMMATORE HELLO WORD ...... ANCHE L'ULTIMA
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5