Gridview con dati da più Db

lunedì 22 agosto 2011 - 13.52
Tag Elenco Tags  VB.NET  |  .NET 4.0

matteoct Profilo | Junior Member

Salve, espongo brevemente il mio problema:
Ho una gridview mediante la quale visualizzo dei dati di un Db <<NON>> locale.
Ho aggiunto una colonna nella quale vorrei inserire una label (o immagine) che, per ogni riga, mi segnali la presenza o meno di quel dato nel Db locale.

Ho fatto numerose prove ma proprio non riesco a risolverlo, cioè non riesco a valorizzare quella label.

Qualche consiglio?
Grazie


DomA Profilo | Expert

Prova spiegarti meglio.
Se ho capito bene comunque dovresti utilizzare un for... next e controllare (tramite la chiave primaria) se il record della tabella remota è uguale a quello del db locale.

http://www.infomidia.it

Domenico

alx_81 Profilo | Guru

>Salve, espongo brevemente il mio problema:
Ciao

>Ho una gridview mediante la quale visualizzo dei dati di un Db
><<NON>> locale.
>Ho aggiunto una colonna nella quale vorrei inserire una label
>(o immagine) che, per ogni riga, mi segnali la presenza o meno
>di quel dato nel Db locale.

>Qualche consiglio?
puoi gestire l'evento RowDataBound: http://msdn.microsoft.com/it-it/library/system.web.ui.webcontrols.gridview.rowdatabound.aspx
In quell'evento dovrai chiederti se un particolare valore che arriva da db è quello che ti aspetti o meno e gestire la casistica sul valore della label/immagine.

>Grazie
di nulla!
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

Gluck74 Profilo | Guru

ciao,
dunque, qui bisognerebbe stare attenti anche alle prestazioni.
Agendo infatti in maniera sbagliata, si rischia di fare n chiamate consecutive al database.

Io farei in questa maniera:
eseguo la stessa query su entrambi i database e memorizzo le due DataTable in un Dataset.
A questo punto potrei creare una join tra le due tabelle direttamente nel DataSet
http://emmet-gray.com/Articles/DataTableJoins.htm
http://support.microsoft.com/kb/325682/EN-US/
http://social.msdn.microsoft.com/Forums/en/adodotnetdataproviders/thread/f122d7f4-3b7d-4d93-bd0f-8bb57cd990a4
ed eseguire la giusta select per capire quali dati sono presenti anche nel DB locale.

Utilizzando questo risultato per popolare la gridView, ed agento sull'evento RowDataBound, è semplice determinare se e cosa scrivere nella label.

Ciao

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

matteoct Profilo | Junior Member

Intanto grazie a tutti per i consigli.
In merito a quanto ha suggerito Gluck, è proprio quello che sto cercando di fare, ma i risultati della tabella 1 non sono allineati con la seconda datatable!

Faccio un breve esempio della mia situazione:
Ho diverse sedi di un'azienda. Dalla sede centrale, tramite la mia applicazione e con una dropdownlist, seleziono l'azienda dalla quale visualizzare i dati, dopodichè popolo la gridview. Fin quì nulla di particolare.

La query va ad elencare i prodotti disponibili nell'azienda selezionata ed io, per ogni riga del gridview, devo sapere se quel prodotto è presente in magazzino o meno (quest'ultimo dato disponibile su Db esterno).

Quindi, riassumendo:
- Seleziono tutti i prodotti dell'azienda X
-per ogni prodotto, calcolo la disponibilità nel magazzino (dato disponibile su Db della sede centrale)
-Popolare il gridview con i dati del prodotto e della disponibilità in magazzino.

Io faccio questo ed ottengo i dati giusti, ma non sono allineati nel gridview, nel senso che vengono scritte prima le righe della datatable1, quindi dei prodotti, poi quelle della disponibilità in magazzino, quindi della 2° datatable:

-dichiaro le due datatable
-scrivo la query (seleziona tutti i prodotti di quell'azienda)
-apro la connessione con SqlCommand
-creo un datareader
-poi con un ciclo:
while reader.read
....
qui con un'altra query mi calcolo il totale del singolo prodotto

-creo un nuovo SqlDataAdapter e utilizzo Fill per la 2° Datatable
-chiudo il ciclo, creo un nuovo SqlDataAdapter e utilizzo Fill per la 1° Datatable
-poi faccio datatable1.merge(datatable2)

datagridview1.datasource=datatable1
datagridview1.databind()

A questo punto, come già accennato, il datagridview viene popolato con tutte le colonne, ma con i dati sfalsati, perchè vengono scritti prima i records della datatable1 e poi quelli della datatable2!

Per quanto riguarda la relazione non posso farla, perchè in locale non è detto che un prodotto sia censito, quindi non posso fare un join 1:1.

Spero di essere stato più chiaro.

Grazie ancora. Ciao

Gluck74 Profilo | Guru

>La query va ad elencare i prodotti disponibili nell'azienda selezionata
>ed io, per ogni riga del gridview, devo sapere se quel prodotto
>è presente in magazzino o meno (quest'ultimo dato disponibile
>su Db esterno).

a questo punto non ti conviene fare una unica query direttamente sul DB esterno?


>
>Io faccio questo ed ottengo i dati giusti, ma non sono allineati
>nel gridview, nel senso che vengono scritte prima le righe della
>datatable1, quindi dei prodotti, poi quelle della disponibilità
>in magazzino, quindi della 2° datatable:

questo succede quando le chiavi delle tabelle non corrispondono, oppure non ci sono proprio.
esempio se hai due tabelle (key - value - qta) così:
tab1
1 - pere
2 - mele
3 - uva

tab2
4 - pere - 10
5 - banane - 15

è normale che con il merge() vengano elencate tutte le righe
Per fare il merge() ed aggiornare i dati, le chiavi devono essere uguali.
ecco un esempio:
http://msdn.microsoft.com/it-it/library/fk68ew7b.aspx


>Per quanto riguarda la relazione non posso farla, perchè in locale
>non è detto che un prodotto sia censito, quindi non posso fare
>un join 1:1.

ecco perché io farei una query direttamente sul DB esterno
se hai la relazione azienda -> prodotti sul DB esterno
se non hai questa relazione e devi per forza usare il DB della tua applicazione allora farei cosi:
1 - dalla tua applicazione scegli l'azienda per avere l'elenco dei prodotti
2 - ricavi solo gli ID di tutti i prodotti
3 - sul database esterno calcoli le quantità filtrando per ID prodotto

SELECT *, qtacalcolata from tblProdotti where IDProdotti in (risultato)



____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

matteoct Profilo | Junior Member

Grazie per le uteriori indicazion Gluck.
Tuttavia sto optando per un'altra strada: considerato che i dati non sono tanti, importo il db prodotti nella sede principale; poi per quanto riguarda la query, utilizzerò l'istruzione Left Join (http://www.w3schools.com/sql/sql_join_left.asp) e poi sostituirò il valore null con "prodotto terminato" o altro!

Avevo un'altra idea del merge dei dataset o datatable!
grazie ancora
Ciao

Gluck74 Profilo | Guru

la prima soluzione che ti avevo proposto, in pratica fa la stessa cosa senza dover importare il DB centrale.
Ovvero carichi un datatable con solo i dati che ti servono invece di tutto il DB,
poi con una relazione puoi eseguire ugualmente la "LEFT JOIN" in memoria ed avere lo stesso risultato.
Prova a vedere i link che ti ho dato.

Tieni comunque in considerazione anche la soluzione di fare direttamente la query filtrata sul DB esterno.

Magari con qualche riga di codice in più ti risparmi di dover importare sempre il DB, che non è una cosa bella (io eviterei).


____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

matteoct Profilo | Junior Member

Niente da fare Gluck, ho fatto numerose prove ma non riesco ad ottenere lo stesso risultato che ottengo semplicemente facendo una query con Left Join tra le due tabelle; con i datatable, con i quali non ho tanta dimistichezza, non ci riesco, nonostante abbia consultato i tuoi link e tantissimi altri.

Quella d'importare solo i dati della tabella prodotti (e non tutto il Db) e poi facendo una query con Left Join mi sembra la strada più semplice ed efficace.

Grazie per gli ottimi consigli!
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5