Originariamente inviata da
alka
Come da documentazione, il
TableAdapter utilizza le relazioni e si occupa di aggiornare anche le tabelle correlate.
Si tratta di un oggetto che coordina il lavoro su una tabella, ma questo avviene in concerto con gli altri "adapter" collegati ad altre tabelle, anche perché altrimenti l'integrità referenziale sul database di destinazione non potrebbe essere garantita o potrebbe scatenare degli errori.
Leggi ad esempio
questa pagina e quelle dello stesso capitolo per approfondire il funzionamento nel dettaglio con diversi scenari.
Ciao!
Ok ho letto ed eseguito scrupolosamente le istruzioni ed in effetti così funziona...
Se però replico nel mio progetto dove il caso vuole però che io non usi le automatizzazioni al 100% come in questo articolo non funge più...quindi a sto punto forse sbaglio il metodo di binding...o popolamento...o non lo so
Vi dico esattamente cosa faccio:
- Creo un dataset nel designer semplicemente trascinando le tabelle dalla finestra Server Explore
- Il designer mi crea una relazione tra le datatable (pescandola dal DB), io la edito inserendo i vincoli di chiave esterna, i Cascade ecc ecc
- inserisco un'istanza del dataset (in modalità progettazione) trascinandola dalla casella degli strumenti
- inserisco un'istanza del tableAdapterManager allo stesso modo
- inserisco 2 datagridview allo stesso modo
- inserisco 2 bindingsource allo stesso modo
- collego i BindingSource all'istanza del Dataset e alla rispettiva tabella (datasource e datamember)
- collego la fonte dati delle 2 dgview ai rispettivi binding
- aggiungo 2 bottoni al form
Il design è completo!
Passiamo ad un'esempio di inserimento ed update
Per aggiungere una riga nell tab padre e 2 collegate nella tab figlio:
codice:
'ds1 è ovviamente il nome dell'istanza del dataset che ho trascinato sul form
Dim r as ds.tabPadreRow=ds1.tabPadre.newTabPadreRow
r.campo1="Ciao"
r.campo2="Sono Veronica"
ds1.tabPadre.rows.addTabPadreRow(r)
dim f as ds.tabFiglioRow=ds1.tabFiglio.newTabFiglioRow
f.campo1="Riciao"
f.idTabPadre=r.campoID
ds1.tabFiglio.rows.addTabFiglioRow(f)
questo è tutto!
Se provo ad aggiornare con:
codice:
miaIstanzaTableAdapterManager.updateAll(ds1)
idem se uso in serie i singoli tableadapter non usando il tableAdapterManager con:
codice:
myTaTabPadre.update(ds1.tabPadre)
myTaTabFiglio.update(ds1.tabFiglio)
in quest'ultimo caso ho verificato (come già scritto) che succede perchè già il primo update (tabPadre) marca anche le righe di tabFiglio (non so perchè) come unchanged
Quindi ancora una volta mi aggiorna la tab padre (nel DB) ma non la tab figlio...
Inoltre non mi allinea nemmeno gli id (che sul Database a volte sono diversi essendo autoincrement)...
Cosa sbaglio nel fare ciò che faccio? Grazie...sto iniziando a perdere la speranza