DataGridView e Update

martedì 13 novembre 2007 - 15.19

fraizzo Profilo | Newbie

Ciao a tutti, chiedo il vostro aiuto per un problema che non riesco a risolvere.

In una form ho un dgv che popolo con questo codice

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

E fin qui tutto bene.

Ora vorrei poter aggiornare i dati sul db direttamente dal dgv.

Potete aiutarmi?

Grazie

SSUPERPIPPO Profilo | Guru

>Ciao a tutti, chiedo il vostro aiuto per un problema che non
>riesco a risolvere.
>
>In una form ho un dgv che popolo con questo codice
>
>Dim myadapter As New OleDb.OleDbDataAdapter
> Dim mydataset2 As New DataSet
>
> mydataset.Clear()
>
> myadapter.SelectCommand = New OleDb.OleDbCommand
> myadapter.SelectCommand.Connection = myconnection
>
>myadapter.SelectCommand.CommandText = "SELECT First(nomi.nome)
>AS Nome, First(Rapporti.INDX) AS INDX, Rapporti.Valore FROM Rapporti
>INNER JOIN (sostanze INNER JOIN nomi ON sostanze.Chiave = nomi.chiave)
>ON Rapporti.INDX = sostanze.INDX GROUP BY Rapporti.Valore, Rapporti.Nr_Protocollo
>HAVING(((Rapporti.Nr_Protocollo) = " & txtprotvar & "))ORDER
>BY First(nomi.nome);"
>
>myadapter.SelectCommand.CommandType = CommandType.Text
>
> myconnection.Open()
>
> myadapter.Fill(mydataset2, "sostanze")
>
> myconnection.Close()
> myconnection.Dispose()
> mycommand.Dispose()
>
> Dim dgvcolorecelle As New DataGridViewCellStyle()
> dgvcolorecelle.BackColor = Color.WhiteSmoke
>Form1.DGV2.AlternatingRowsDefaultCellStyle = dgvcolorecelle
>
> Form1.DGV2.AutoGenerateColumns = True
> 'Form1.DGV2.AllowUserToDeleteRows = False
>
> Form1.DGV2.DataSource = mydataset2
>
> Form1.DGV2.DataMember = "sostanze"
> Form1.DGV2.Columns("valore").ReadOnly = False
>Form1.DGV2.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
>
>E fin qui tutto bene.
>
>Ora vorrei poter aggiornare i dati sul db direttamente dal dgv.
>
>Potete aiutarmi?
>
>Grazie

Devi utilizzare il metodo Update del DataAdapter utilizzato per la creazione del DataSet.

Se ti può essere utile, nel mio blog troverai un articolo con una classe per la gestione semplificata degli accessi al Database.

Ciao

Alessandro

http://blogs.dotnethell.it/alebadalin

fraizzo Profilo | Newbie

Allora....

Con il codice

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

dovrei riuscire a scrivere i dati sul db ma ottengo "Violazione di concorrenza: UpdateCommand ha modificato 0 dei 1 record previsti."

Sto leggendo un pò in giro ma non ho ancora capito cosa devo cercare in realtà.

Come avrai capito sono un pò a digiuno di vb.net, sto cominciando solo ora e cerco di arrangiarmi come posso (se tutto va bene a breve mi sparo un bel corso, a proposito, consigli???)

Grazie ancora

P.s. ho messo nei bookmark il tuo blog, ci sono un bel pò di cose da leggere con tutta calma

SSUPERPIPPO Profilo | Guru

> Dim sql As String
>sql = "update rapporti set valore=@valore where nr_protocollo
>= """ & protocollo & """ and indx=@indx"
>
> Dim cmd As New OleDb.OleDbCommand(sql, myconnection)
>
> myadapter.UpdateCommand = cmd
>myadapter.UpdateCommand.Parameters.AddWithValue("@valore", "valore")
>myadapter.UpdateCommand.Parameters.AddWithValue("@indx", "indx")

1. Perchè non parametrizzi anche la variabile 'percorso' della clausola WHERE?

2. Non credo che tu voglia passare al parametro @valore la stringa "valore"... probabilmente volevi passargli il contenuto di una tua variabile chiamata 'valore', togli quindi le virgolette che identificano una stringa:

myadapter.UpdateCommand.Parameters.AddWithValue("@valore", valore)

3. Accertati che non vengano violate le chiavi primarie impostate nelle tabelle

4. Importante chiaramente che venga SEMPRE impostata una chiave primaria!

Fammi sapere, ciao

Alessandro


http://blogs.dotnethell.it/alebadalin

fraizzo Profilo | Newbie

>> Dim sql As String
>>sql = "update rapporti set valore=@valore where nr_protocollo
>>= """ & protocollo & """ and indx=@indx"
>>
>> Dim cmd As New OleDb.OleDbCommand(sql, myconnection)
>>
>> myadapter.UpdateCommand = cmd
>>myadapter.UpdateCommand.Parameters.AddWithValue("@valore", "valore")
>>myadapter.UpdateCommand.Parameters.AddWithValue("@indx", "indx")
>
>1. Perchè non parametrizzi anche la variabile 'percorso' della
>clausola WHERE?

é parametrizzata correttamente

>
>2. Non credo che tu voglia passare al parametro @valore la stringa
>"valore"... probabilmente volevi passargli il contenuto di una
>tua variabile chiamata 'valore', togli quindi le virgolette che
>identificano una stringa:
>
>myadapter.UpdateCommand.Parameters.AddWithValue("@valore", valore)

Quel "valore" in realtà è il nome della colonna del dataset che passo al dataadapter

>
>3. Accertati che non vengano violate le chiavi primarie impostate
>nelle tabelle

Ok

>
>4. Importante chiaramente che venga SEMPRE impostata una chiave
>primaria!

Ho impostato un campo numerico COUNTER, proprio per evitare problemi.

>
>Fammi sapere, ciao
>
>Alessandro
>
>
>http://blogs.dotnethell.it/alebadalin

Ci lavoro su e ti tengo informato, 1000 grazie per l'aiuto


SSUPERPIPPO Profilo | Guru

>>> Dim sql As String
>>>sql = "update rapporti set valore=@valore where nr_protocollo
>>>= """ & protocollo & """ and indx=@indx"
>>>
>>> Dim cmd As New OleDb.OleDbCommand(sql, myconnection)
>>>
>>> myadapter.UpdateCommand = cmd
>>>myadapter.UpdateCommand.Parameters.AddWithValue("@valore", "valore")
>>>myadapter.UpdateCommand.Parameters.AddWithValue("@indx", "indx")
>>
>>1. Perchè non parametrizzi anche la variabile 'percorso' della
>>clausola WHERE?
>
>é parametrizzata correttamente

Scusami ma non mi sembra proprio...
per parametrizzarla dovresti usare:

sql = "update rapporti set valore=@valore where nr_protocollo=@protocollo and indx=@indx"
myadapter.UpdateCommand.Parameters.AddWithValue("@protocollo", protocollo)

>
>>
>>2. Non credo che tu voglia passare al parametro @valore la stringa
>>"valore"... probabilmente volevi passargli il contenuto di una
>>tua variabile chiamata 'valore', togli quindi le virgolette che
>>identificano una stringa:
>>
>>myadapter.UpdateCommand.Parameters.AddWithValue("@valore", valore)
>
>Quel "valore" in realtà è il nome della colonna del dataset che
>passo al dataadapter
>

Da come hai posato il codice mi sà che non hai proprio le idee chiare su come usare i parametri...

Il metodo AddWithValue("@nomeparametro", valore) serve a passare un valore al parametro specificato che andrà quindi a sostituirsi nell'istruzione SQL. Esempio:

sql = "SELECT * FROM TuaTabella WHERE Campo=@Parametro" Dim cmd As New OleDb.OleDbCommand(sql, myconnection) Dim TuaVariabile as String = "PROVA" cmd.AddWithValue("parametro", TuaVariabile)

In questo caso la tua sql parametrica sarà così interpretata:

SELECT * FROM TuaTabella WHERE Campo='PROVA'

>>
>>3. Accertati che non vengano violate le chiavi primarie impostate
>>nelle tabelle
>
>Ok
>
>>
>>4. Importante chiaramente che venga SEMPRE impostata una chiave
>>primaria!
>
>Ho impostato un campo numerico COUNTER, proprio per evitare problemi.
>
>>
>>Fammi sapere, ciao
>>
>>Alessandro
>>
>>
>>http://blogs.dotnethell.it/alebadalin
>
>Ci lavoro su e ti tengo informato, 1000 grazie per l'aiuto
>
>
>

Spero di esserti stato di aiuto

Ciao

Alessandro

http://blogs.dotnethell.it/alebadalin
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5