Newsgroup: it.comp.lang.visual-basic
Titolo: VB.net ...DATASET dubbio amletico!

Non sono un esperto di ADO.net...
lo sto digerendo piano piano...e forse lo stò anche apprezzando (con
calma eh!)
Ho un dubbio amletico....
sino ad ora mi sono sempre arrangiato e le varie datatable dentro un
dataset venivano aggiornate mantenendo vivi d dataadapter o peggio
ancora andando di command e eseguenza una query su una connection
Ora dovrei "OOppizzarmi" davvero!
Ho questo scenario:
Il db è access...ma non rileva(cambia solo il provider)
Ho un dataset che contiene più datatable...provenienti da DB diversi.
Le datatable hanno ognuna di esse un dataadapter...il dataAdapter ha i
suoi bei command generati opportunamente da me.
In uno scenario di test...le tabelle modificate vengono aggiornate dal
dataAdapter
Ora però il dubbio amletico....
ho una Classe RecuperaDB....opportunamente settate le proprietà invoco
il metodo GeneraDataSet...e mi espone un Dataset con dentro tutte le
datatable....
Imputo il dataset ad un altra classe "ManipolaDB" che espone la
proprietà MioDataset
Il Dataset vive in memoria...distruggo la classe RecuperaDB....
Il Dataset continua a vivere...anzi nella classe manipolaDB io
aggiungo o elimino records...
Problema...come aggiorno i database???
I dataAdapter non esistono più!
Non ho trovato di meglio che andare pesante di query SQL e gestire
eventuali errori!
Ho provato a crearmi un dataadapter recuperare una datatable ed
imputargli quella del dataset...ma mi esplode!
E' veramente impossibile aggiornare un dataset che "passa" da una
classe ad un altra tramite dataAdapter?
Finche il dataset è semplice poco male...ma in caso di Dataset
complesso....aggiornarmelo a manina stile Vb6 (anzi neanchè...buon
caro vecchio recordset a questi punti)....non mi passa più!
Probabilmente ci sarà verso farlo....ma io non so come...chi me lo
spiega???
Grazie!

Secondo me devi passarti i dataadapter e non i dataset.
Il dataset lo ricrei in ogni classe e lo riempi con i dataadapter che 
passi da classe a classe.
Nicola

 ha scritto nel messaggio 
news:af365f49-9144-4aa2...@d45g2000hsc.googlegroups.com...
Non sono un esperto di ADO.net...
lo sto digerendo piano piano...e forse lo stň anche apprezzando (con
calma eh!)
Ho un dubbio amletico....
sino ad ora mi sono sempre arrangiato e le varie datatable dentro un
dataset venivano aggiornate mantenendo vivi d dataadapter o peggio
ancora andando di command e eseguenza una query su una connection
Ora dovrei "OOppizzarmi" davvero!
Ho questo scenario:
Il db č access...ma non rileva(cambia solo il provider)
Ho un dataset che contiene piů datatable...provenienti da DB diversi.
Le datatable hanno ognuna di esse un dataadapter...il dataAdapter ha i
suoi bei command generati opportunamente da me.
In uno scenario di test...le tabelle modificate vengono aggiornate dal
dataAdapter
Ora perň il dubbio amletico....
ho una Classe RecuperaDB....opportunamente settate le proprietŕ invoco
il metodo GeneraDataSet...e mi espone un Dataset con dentro tutte le
datatable....
Imputo il dataset ad un altra classe "ManipolaDB" che espone la
proprietŕ MioDataset
Il Dataset vive in memoria...distruggo la classe RecuperaDB....
Il Dataset continua a vivere...anzi nella classe manipolaDB io
aggiungo o elimino records...
Problema...come aggiorno i database???
I dataAdapter non esistono piů!
Non ho trovato di meglio che andare pesante di query SQL e gestire
eventuali errori!
Ho provato a crearmi un dataadapter recuperare una datatable ed
imputargli quella del dataset...ma mi esplode!
E' veramente impossibile aggiornare un dataset che "passa" da una
classe ad un altra tramite dataAdapter?
Finche il dataset č semplice poco male...ma in caso di Dataset
complesso....aggiornarmelo a manina stile Vb6 (anzi neanchč...buon
caro vecchio recordset a questi punti)....non mi passa piů!
Probabilmente ci sarŕ verso farlo....ma io non so come...chi me lo
spiega???
Grazie!

 update.
zac
Rispondo a tutti e due....ok per il dataadapter bla bla....
però io VORREI (se possibile) avere questo scenario:
CLASSE1...si connette ad un DB generico...non importa il tipo...a noi
rileva che alla fine espone una proprietà MioDataset (as dataset)
il programma esegue una
CLASSE2.UsaDataset=CLASSE1.MioDataset
di classe1 me ne frego adesso....nel test addirittura CLASSE1.dispose
Bon
Classe2 adesso usa un dataset che vive in memoria...non ci sono più
dataadapter!
Classe2 usa il dataset e lo modifica
Classe2 dovrebbe adesso scrivere nel DB generico le modifiche
Attualmente come faccio?....a manina:
....apertura connessione
...command
... risolvi eventuale errore
Pratico per la tabella Anagrafica ...un po meno se ci sono tabelle
correlate ...e casomai non lasci al db tramite stored il compito di
eventuali concorrenze e conflitti.
Cosa che fa non benissimo....ma molto meglio di me un dataadapter!
Quindi il problema sarebbe ...in altri termini
Posta l'esistenza di un dataset contenente  Datatable e Relations e
vivo e vegeto nella ram del mio pc.....
Posto il fatto che sicuramente esiste un database che ha uno Schema
simile (simile significa ad esempio che ho estratto 5 tabelle
relazionate fra loro invece di tutte le 50 tabelle del database)  ...
Come faccio a costruirmi un dataadapter(uno o più  ovvio!) che
aggiorni questo dataset?
In ANCORA ALTRI TERMINI.....
la sequenza è  dataAdapter ---> Dataset
esiste l'incontrario
Dataset ---> DataAdapter???
Posso risalire da un dataset ...anzi da una datatable...al datadapter
che l'ha generata?
Mi sono un po perso....sarà l'acqua che stà venendo giù (tra un po vdo
al lavoro in canotto)...ma non vedo soluzione!
Grazie della pazienza!

 ha scritto nel messaggio 
news:1dddd553-94c8-4811...@d1g2000hsg.googlegroups.com...


 che l'ha generata?
Questo l'avevo capito nel primo post ;)
Che io sappia non è possibile ricavarsi il dataadapter da un dataset (ma 
magari mi sbaglio).
Per come la vedo io il data adapter è come un tubo dell'acquedotto a cui 
colleghi una cisterna (dataset). Se sposti la cisterna in mezzo al 
deserto, non hai altri tubi dell'acquedotto... e dalla cisterna non puoi 
ricavartene (ovviamente!).
Quello che ti sto consigliando io è... invece di trasportare la cisterna 
da un posto all'altro, trasferisci tutto l'acquedotto (che in ogni caso 
avresti dovuto ricostruire).
Quindi, non passarti il dataset, ma il dataadapter corrispondente e poi, 
con Da.Fill riempi il dataset dove ti serve.
Nicola

 Nicola
mmmm Nicola....alla fine basta che funzioni?...ok!
Però questo sistema (del trasportare l'acquedotto) anche se funziona
mi sa tanto di vecchio vb6!
Della serie..."io apro la connection all'inizio e finche non mi stacco
la tengo in vita!"
Se sono a studiare stoca**o di OOP leggo in tutti i libri ...che tutte
le classi dovrebbero essere considerate come "mondi
chiusi"...autoconclusivi...che comunicano con l'esterno solo tramite
proprietà.
ORA
se dichiaro un DataAdapter PUBLIC
meglio FRIEND...me la poteri cavare con l'escamotage della classe
padre ...e tutto deriva da quella classe...e il dataadapter si
"propaga"
Mi sembrava molto più corretto che pubblico fosse il "contenitore" non
il tubo con cui lo riempio!
Ossia che ci fosse comune al progetto il dataset...usato come un
"bufferone" che rioempio e svuoto alla bisogna!
Allora si che trovo anche io poco avvezzo all'OOP vantaggi ad avere
tanti "mattoncini lego" che interagiscono.
in questi giorni ho letto tanto sull'argomento....e trovo pareri
discordanti....c'è chi invoca dataset +dataadapter come un ottimo
compromesso....e chi invece trova limitati i dataset e preferisce
spippolare via command e codice
Nella mia infinita ignoranza sarei portato a considerare il
dataadapter come una comoda scorciatoia alla scrittura veloce di
codice non ottimizzato ...2 click e 3 righe di codice e via!
E quindi in una ottica di una applicazione un po più complessa...forse
il fatto di aggiornare tramite command non è poi stata una cattiva
idea.
p.s.
Logicamente ringrazio ICLVB(anche nella veste ".net")....non provo
neanche a chiedere ai colleghi(casomai si arrabbiano di questa mia
definizione) MVP...  di mpidv... per una serie di simpatiche ragioni
che sono un po troppo OT!

 spippolare via command e codice
Personalmente lavoro quasi sempre con DataReader e command, per una 
questione di performance. Ovviamente non disdegno dataset, dataadapter 
ecc per piccole porzioni "stupide", ma se si vuole davvero un sistema 
performante (milioni di record al minuto...) non c'è nulla di meglio dei 
singoli mattoncini, difficili da programmare, ma estremamente potenti e 
versatili.
Inoltre, se ti riesce, fai un sistema "provider agnostic" nel senso che 
possa girare su qualsiasi database creando il provider a runtime. Questo 
ti garantisce prestazioni eccezionali su qualsiasi database, senza 
legati alla lentezza di OleDB.
Nicola

 Nicola
mmmm....questa ancora mi manca!
Capisco che posso crearmi una o più classi ed a queste chiedere "dammi
l'elenco delle fatture"...e loro ci penseranno a interfacciarsi con
uno dei tanti motori db e sarà cura loro riempirmi una o più
datatable!
Intendi questo per creare un provider a runtime?
O proprio derivare dalla classe base?
O altro???
Illuminami please!!!
:o)

 Intendi questo per creare un provider a runtime?
Esatto, vai ad istanziare il provider a runtime.
Ora tu usi, presumibilmente, un OledbProvider o un SQLProvider.
Per varie ragioni mi sono trovato a dover parametrizzare molte cose, tra
cui anche il provider da lanciare.
Da questa esperienza ho capito quanto sia poco accorto usare un provider
fisso... con qualche riga di codice in piů si puň creare un programma
che usi qualsiasi provider (anche OracleProvider, SQLiteProvider ecc...)
e quindi il "meglio" dal punto di vista delle prestazioni.
Unico neo: č leggermente (ma davvero leggermente) piů noioso da usare,
perchč devi fare tutto a manina (niente wizard di mamma MS).
Dai un'occhiata a questo articolo interessante:
http://davidhayden.com/blog/dave/archive/2005/10/30/2550.aspx
Nicola