Aggiornamento dati

mercoledì 25 febbraio 2009 - 18.18

pedro8a Profilo | Junior Member

Ho questo codice:

MyDataAdapter = New SqlDataAdapter("Select * From TabProva", Cn)
MyDataAdapter.Fill(MyDataSet, "Prova")

Dim MyBinding As New BindingSource()
MyBinding.DataSource = MyDataSet.Tables("Prova")

DataGridView.DataSource = MyBinding.DataSource

txtProva.DataBindings.Add("Text", MyBinding, "prova")

Se modifico txtprova, come faccio ad aggioranre i dati sul db?

Jeremy Profilo | Guru

Ciao Pedro.
MyDataAdapter.Update
Ma credo che sia opportuno, prima, valorizzare la proprietà UpdateCommand,DeleteCommand ed InsertCommand usando un CommanBuilder che, si preoccuperà di valorizzarle a dovere per l'aggiornamento dei dati sul Db.
Comunque, per sicurezza, dopo aver eseguito il Fill, prova a stampare a video i valori delle proprietà sopra citate.

Facci sapere....
Ciao

pedro8a Profilo | Junior Member

Mamma mia parli arabo...
in termini di codice cosa beddo fare?

Jeremy Profilo | Guru

>Mamma mia parli arabo...
ah ... sei italiano ... scusa non l'avevo capito. ... allora provo a parlare in italiano.
>in termini di codice cosa beddo fare?
Il DataAdapter, è, come suggerisce anche il suo nome, un oggetto che ti permette di mantenere un riferimento a quanto c'era nella tabella al momento del caricamento dei dati(Fill) ... pur essendo 'disconnesso'

Non ricordo bene, ma credo, che nel momento in cui riempi una DataTable con il metodo Fill del dataadapter, vengano automaticamente create anche le Query(o meglio gli oggetti Command) di Inserimento,cancellazione e modifica dei dati(purchè tu mantenga la stessa struttura del datatable al momento del caricamento) rispettivamente nelle proprietà CommandText di InsertCommand,DeleteCommand e UpdateCommand.

Per verificare quanto detto, potresti, dopo l'istruzione Fill(Ds,blablabla.... scrivere le seguenti righe di codice:

MessageBox.Show(MyDataAdapter.UpdateCommand.CommandText) MessageBox.Show(MyDataAdapter.DeleteCommand.CommandText) MessageBox.Show(MyDataAdapter.InsertCommand.CommandText)
Se ricevi una qualche eccezione,o le trovi vuote, allora vuol dire che devi prima usare il CommandBuilder per fare quanto detto. (è solo una mia lacuna .... non ricordo bene come funziona il dataadapter).

Rimango comunque a disposizione per ulteriori chiarimenti.
Facci sapere....
Ciao

pedro8a Profilo | Junior Member

Ciao Jeremy,
ma sapresti consigliarmi un buon libro su ado.net e vb2008?

Ciao

pedro8a Profilo | Junior Member

Per aggiornare ho scritto:

Cn.Open()
MyDataAdapter.Update(MyDataSet.Tables("prova"))

nel datagridview mi fa vedere la modifica che ho fatto.
Poi chiudo e riapro il progetto e le modifiche non ci sono +

Stò diventando pazzo....

fausto1965 Profilo | Newbie

Scusate l'intromissione
Sicuramente l'avrete già verificato, in caso contrario, verificate la proprietà del del DataSet "Copia nella directory di OutPut".
A seconda di come è impostata tale proprietà, in fase di debug mostra o meno i dati aggiornati del Db.

Ho scoperto l'acqua calda???

pedro8a Profilo | Junior Member

Ho verificato anche nel db,
i dati non sono aggiornati.

Jeremy Profilo | Guru

Ciao Pedro.
Probabilmente non hai fatto quanto ti ho suggerito(altrimenti mi avresti indicato i risultati della prova):

>Per verificare quanto detto, potresti, dopo l'istruzione Fill(Ds,blablabla.... scrivere le seguenti righe di codice:
>MessageBox.Show(MyDataAdapter.UpdateCommand.CommandText) >MessageBox.Show(MyDataAdapter.DeleteCommand.CommandText) >MessageBox.Show(MyDataAdapter.InsertCommand.CommandText)
>Se ricevi una qualche eccezione,o le trovi vuote, allora vuol dire che devi prima usare il CommandBuilder per fare quanto detto. (è solo una mia >lacuna .... non ricordo bene come funziona il dataadapter).

Prova a fare come ti ho suggerito ... nel caso non ne venissi fuori .... posso provare a prepararti un progettino di esempio ..... ma prima fai come ti ho indicato.
Se lo fai tu .... è meglio(per te).

Facci sapere...
Ciao

pedro8a Profilo | Junior Member

allora, ho scritto

MyDataAdapter = New SqlDataAdapter("Select * From TabProva", Cn)
MyDataAdapter.Fill(MyDataSet, "Prova")

MessageBox.Show(MyDataAdapter.UpdateCommand.CommandText)
MessageBox.Show(MyDataAdapter.DeleteCommand.CommandText)
MessageBox.Show(MyDataAdapter.InsertCommand.CommandText)

ma mi ritorna questo errore:

NullReferenceException
Riferimento a un oggetto non impostato su un'istanza di oggetto.

Jeremy Profilo | Guru

Ciao Pedro.
>ma mi ritorna questo errore:
>NullReferenceException
>Riferimento a un oggetto non impostato su un'istanza di oggetto.
Come ti dicevo, l'errore sta a significare che gli oggetti Command relativi all'aggiornamento,modifica e cancellazione dei dati sono Nothing.
Probabilmente bisogna inizializzarli usando un commandbuilder(si potrebbe fare anche a manina ....).
Purtroppo stasera parto per Modena....se mi dai tempo fine settimana ti preparo un progettino di esempio con l'uso del dataadapter.

A presto ....
Ciao

Jeremy Profilo | Guru

Ciao Pedro.
Ti ho preparato un progettino di esempio per l'aggiornamento dei dati tramite DataAdapter.
per mia comodità ho usato un Db di Access(incluso nel progettino) ... per adattarlo al tuo codice è sufficiente prendere gli oggetti dal namespace SqlClient.(il concetto rimane lo stesso).
Ovviamente, fare copia/incolla, sarebbe controproducente, quindi rimango a disposizione qualora avessi bisogno di info a riguardo.
Non mi sono soffermato troppo sul resto del codice (gestione errori, etc.....)
Il progettino l'ho sviluppato con VS2008 .... se dovessi avere problemi ..... facci sapere.
Ciao.

pedro8a Profilo | Junior Member

Ciao Jeremy,
funziona ma solo se modifico i dati direttamente nel datagrid.
Se seleziono una riga, modifico i dati nella textbox, nel datagrid non cambia nulla, debbo cliccare un altra riga nel datagrid e i dati cambiano, poi clicco
"salva modifiche" e i dati vengono aggiornati.

Facendo altre prove, funziona anche se aggiorno la colonna prezzo, clicco su "agg. dati" e poi seleziono un altra colonna.

Volevo anche fare una altra cosa.
Con vb6, nel datagrid, mettevo visible=false le colonne che non interessano direttamente all'utente come l'IDArticolo.
Quando l'utente clicca sulla riga nella variabile IdArtocolo memorizzo l'idarticolo. E in vb2008????

Jeremy Profilo | Guru

>Ciao Jeremy,
Ciao Pedro.
>funziona ma solo se modifico i dati direttamente nel datagrid.
>Se seleziono una riga, modifico i dati nella textbox, nel datagrid
>non cambia nulla, debbo cliccare un altra riga nel datagrid e
>i dati cambiano, poi clicco
>"salva modifiche" e i dati vengono aggiornati.

Ti ricordi quando scrissi
>Non mi sono soffermato troppo sul resto del codice (gestione errori, etc.....)
Bhe .... tra gli etc.. probabilmente era incluso anche questo aspetto.
Ti ho scritto un progettino di esempio con il quale hai un approccio per fare ciò che avevi inizialmente chiesto di fare.
Ora, mi farebbe piacere(nel tuo interesse) se ci lavorassi su un pò per capire come integrarlo e aggiustarlo alle tue esigenze .....

Comunque, per completezza, se vuoi aggiornare i valori del datagrid, ogni volta che 'Lasci' una Textbox, puoi scrivere questo codice(per esempio relativo alla textbox2) nell'evento Leave della textbox:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
eventualmente fai un pò di prove e poi .... facci sapere....
Ciao

pedro8a Profilo | Junior Member

Ciao Jeremy,
il mio intento è quello di riprodurre le cose che facevo con vb6 adattandomi naturalmente a vb.net.

Utilizzavo molto questa tecnica.
La colonna con il campo IDMiaTabella è nascosta all'utente. Quando questo clicca sulla riga del datagrid (vb6) rismpio una variabile con il valore del campo IDMiaTabella. A questo punto, ad esempio apro un form con il dettaglio della riga selezionata (rs.: chiamata selezionata (software che ho realizzato in vb6 per la gestione delle chiamate)).
Con vb.net non riesco a fare la stessa cosa e allora ho messo una textbox con il campo IdMiaTabella nascosto (TxtIDMiaTabella.Visible=False)..... ma non mi piace molto....
Un altra cosa fondamentale sono i report... che in vb6 uso molto... ma che in vb.net.... vedremo.... se riesco a far comprare l'aggiornamento a vb.net

Jeremy Profilo | Guru

Ciao Pedro
>Con vb.net non riesco a fare la stessa cosa
Facciamo una cosa .... sicuramente, avrai fatto dei tentativi per fare quello che non riesci a fare , giusto?
Mostra il codice che hai prodotto durante i tentativi e vedrai che troveremo sicuramente una soluzione.

Quello che vuoi fare è abbastanza semplice da fare in VB.NET, per questo temo di non avere capito il tuo problema.
Se mostri il codice che hai prodotto, riesco a capire quali potrebbero essere le tue lacune e magari aiutarti.

Facci sapere...
Ciao

pedro8a Profilo | Junior Member

Ciao Jeremy,
purtroppo domani sarò impegnato tutto il giorno.
Appena posso ti preparo il mio lavoro, grazie. Ciao

pedro8a Profilo | Junior Member

Ciao,
finalmente.... ho messo le mani sul progetto che mi hai mandato.

Ho rifatto un mio progetto, ma quando aggiorno i dati, non vengono riportati sul db.
Non mi compare alcun errore.

Ecco tutto il mio codice:
Public Class FrmClienti_Nuovo

Private Ds As DataSet
Private Da As OleDb.OleDbDataAdapter
Private Cmd As OleDb.OleDbCommand

Private Sub FrmClienti_Nuovo_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed

End Sub

Private Sub FrmClienti_Nuovo_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Select Case Cliente_Add_Edit
Case "Edit"
RecuperaDatiCliente()
End Select
End Sub

Private Sub RecuperaDatiCliente()

StrSql = "Select * From TabClienti Where IdCliente=" & IdCliente
StrSql = StrSql & " And IdAzienda=" & IdAzienda

For Each cnt As Control In Me.Controls
If TypeOf cnt Is TextBox Then
cnt.DataBindings.Clear()
End If
Next
cn.Open()
Cmd = New OleDb.OleDbCommand(StrSql, cn)
Da = New OleDb.OleDbDataAdapter(Cmd)
Ds = New DataSet
Dim cmb As New OleDb.OleDbCommandBuilder(Da)
Da.Fill(Ds, "Tabella1")


TxtNome.DataBindings.Add("Text", Ds.Tables(0), "Nome")
'TextBox2.DataBindings.Add("Text", Ds.Tables(0), "Articolo")
'TextBox3.DataBindings.Add("Text", Ds.Tables(0), "Descrizione")
'TextBox4.DataBindings.Add("Text", Ds.Tables(0), "Prezzo")

cmb.GetUpdateCommand()
cmb.GetDeleteCommand()
cmb.GetInsertCommand()

cn.Close()
End Sub

Private Sub SalvaDati()
cn.Open()
Da.Update(Ds.Tables(0))
cn.Close()
End Sub

Private Sub BtnSalvaDati_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSalvaDati.Click
SalvaDati()
End Sub
End Class

Jeremy Profilo | Guru

Ciao Pedro.
innanzitutto tira via cn.open e cn.close che, in questo caso, non servono a nulla.
Poi, tira via anche
cmb.GetUpdateCommand() cmb.GetDeleteCommand() cmb.GetInsertCommand()
che li avevo messi io solo per fare delle prove.
Infine, probabilmente, per risolvere il tuo problema, è sufficiente che tu inserisca l'istruzione
BindingContext(Ds.Tables(0)).EndCurrentEdit()
prima di eseguire l'update.

Se hai ulteriori problemi, prova ad allegare al prossimo post un zip del tuo progettino.

Facci sapere...
Ciao

pedro8a Profilo | Junior Member

Perfetto,
funziona, anche se non ho capitoo questa ultima riga di codice.

Perchè debbo togliere le cn.open e cn.close?

Quando esco dal form quali oggetto debbo scaricare?
Io ho fatto in questo modo:

'apro il form per la modifica/inserimento del cliente
FrmClienti_Nuovo.ShowDialog()

'quando esco scrico il form
FrmClienti_Nuovo = Nothing

Adesso voglio aggingere un gliente ma ds.new???? da.new??? o debbo utilizzare una istruzione Insert?
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