Tbleadapter.update eseguito 2 volte non funziona

venerdì 11 luglio 2014 - 01.06
Tag Elenco Tags  VB.NET  |  .NET 4.0  |  Windows 7  |  Visual Studio 2010  |  Access (.mdb)

DelSol Profilo | Newbie

Salve, una domanda, ho questo codice

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Premendo il primo button, il database e la datagrid si aggiornano. Premendo il secondo pulsante mi aspetterei lo stesso risultato, invece la grid si aggiorna (e ok) ma il database no. Nessun messaggio di errore o altro, semplicemente non viene eseguito l'update.
Qualcuno sa dirmi come mai?

Grazie mille :)

AntCiar Profilo | Expert

Ciao.

Prima di vedere il tuo caso specifico ti spiego come funziona a grandi linee il TableAdapter. Il TableAdapter se vedi ha tre istruzioni parametriche: una per l'INSERT, una per l'UPDATE e una per il DELETE. Questo perchè quando invochi il metodo Update(....) e gli passi un oggetto datatable, il tableAdapter non fa altro che scorrere ogni singola riga del datatable e controllare il valore del RowState della riga.
Questa proprietà indica lo stato di modifica della riga. Quando tu con il Button1 imposti il valore della textbox nella riga/colonna specifica, in automatico la riga ti viene "marchiata" come modificata e quindi il tableAdapter quando la processerà userà l'istruzione di 'update' per trasferire i dati sul DB. Una volta processata la riga, il valore del RowState viene 'azzerato' in modo che se richiami tableAdapter.Update più volte di seguito non ti crei danni al database (pensa al caso in cui la riga la aggiungevi invece di modificarla.....)

Ora come già detto con il Button1 ti funziona perchè effettivamente hai modificato la riga e quindi l'istruzione relativa ti viene eseguia.
Con il Button2 invece non fai altro che associare alla tua tabella la "copia" di un altro datatable (che sicuramente avrà tutte le righe non "marchiate") e quindi non ti succede niente.
Per riscontro prima di fare 'tb = tbprev.Copy' prova a modificare una riga di tbprev e vedi se così funziona. (dovrebbe funzionare a meno che il Copy() non azzera i RowState)


PS. a titolo informativo c'è un metodo dei datatable chiamato AcceptChanges che a primo impatto potrebbe dirti che "conferma i cambiamenti" invece non fa altro che "azzerare" tutti i valori di RowState delle righe del datatable.


un po di documentazione:

http://msdn.microsoft.com/it-it/library/system.data.datarow.rowstate%28v=vs.110%29.aspx
http://msdn.microsoft.com/it-it/library/System.Data.DataRow_properties%28v=vs.110%29.aspx



Cristian Barca

DelSol Profilo | Newbie

Grazie x la dritta, in effetti l'avevo letto secoli fa e dimenticato. Inoltre credevo che il copy impostasse tutti i rowstate in modified, invece non è così.
For i As Integer = 0 To tbprev.Rows.Count - 1 tb.Rows(i)(1) = tbprev.Rows(i)(1) Next
Questo ciclo, invece, imposta tutte le righe su modified. Mi aspettavo, appunto, che il copy facesse qualcosa di simile.

Grazie di nuovo, ciao :)
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