[ASP 2.0 vb/vs 05 exp/sql 05 exp] Update con gridview di tabelle elenc...

martedì 21 ottobre 2008 - 10.11

Devil Profilo | Junior Member

Ciao a tutti,
la mia difficoltà sta nel fatto di aggiornare un record di una tabella elenco atttraverso una gridview.

ipotizziamo due tabelle

TPersone TElencoNazioni
----------- -----------------
idPersona (PK) ____ nazione (PK)
nome /
cognome /
nazione (FK) __/

Creo la mia pagina web, creo il mio SqlDataSource. (altro non è che una select sulla tabella TElencoNazioni)
creo la gridView e le associo l'origine dati(fin qui tutto ok)
La tabella nazioni diciamo che contenga 4 o 5 record e voglio poterli modificare, quindi creo il comando UPDATE

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:SQLConnectionString %>"
DataSourceMode="DataSet"

SelectCommand="SELECT [nazione] FROM [TElencoNazioni]"
updateCommand="UPDATE [TElencoNazioni] set [nazione]=@nazione where [nazione]=@nazione"
>
<UpdateParameters>
<asp:Parameter type="string" Name="nazione"/>
</UpdateParameters>
</asp:SqlDataSource>
</asp:Content>
e aggiungo nella gridview le proprietà AutoGenerateEditButton="true" DataKeyNames="nazione"

Così facendo non si generano errori ma nemmeno effettua l'update...mi sapete indicare il perchè?

Ho provato anche a creare il tutto con il wizard ma il risultato è che non genera il comando update.

Il dubbio mi viene pensando che il campo che voglio modificare è propio la chiave primaria...
comunque sia dovrebbe essere possibile altrimenti devo inserire un id anche nelle tabelle elenco cosa che di solito nemmeno in accces si fa.
Sapreste darmi qualche indicazione?

Grazie ciao

alx_81 Profilo | Guru

>Ciao a tutti,
Ciao

>updateCommand="UPDATE [TElencoNazioni] set [nazione]=@nazione where [nazione]=@nazione"

>Così facendo non si generano errori ma nemmeno effettua l'update...mi
>sapete indicare il perchè?
l'update la fa.. è che il valore rimane lo stesso .
Tu hai scritto una update che, se le passi il valore ipotetico 1 diventa:

UPDATE TElencoNazioni SET nazione = 1 WHERE nazione = 1

E che quindi viene eseguita ma non cambia nulla..

>Il dubbio mi viene pensando che il campo che voglio modificare
>è propio la chiave primaria...
Posso chiederti come mai cerchi di modificare la chiave? Non è buona norma in tabelle di questo tipo (elenchi).
Basta cambiare gli attribut, lasciando invariata la chiave.

>Grazie ciao
di nulla!

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Devil Profilo | Junior Member

Ciao..
ti chiedo allora: una tabella elenco tu la fai così?

TElencoNazioni
----------- -----------------
nazione (PK)

oppure la fai così?


TElencoNazioni
----------- -----------------
idNazione (pk)
descrizioneNazione

Il primo modo è come mi hanno spiegato all'esame di Basi di dati, e con access di solito non da problemi.Mi dicevano che un tempo si usava il secondo modo per risparmiare memoria (si parla anche di pochi byte) ma poi negl'anni, all' aumentare delle capacità degl' hard disck non c'è piu stata questa limitazione.

ho provato a modificare l'update in

UPDATE [TElencoNazioni] set [nazione]=@nazione where [nazione]=@original_nazione

ma va in errore perchè non conosce @original_nazione

Rimanendo nel primo caso di tabella, la mia attuale, come dovrei scrivere l'update affinchè possa modificare il campo?
grazie ciao

alx_81 Profilo | Guru

>Ciao..

>Il primo modo è come mi hanno spiegato all'esame di Basi di dati,
>e con access di solito non da problemi.Mi dicevano che un tempo
>si usava il secondo modo per risparmiare memoria (si parla anche
>di pochi byte) ma poi negl'anni, all' aumentare delle capacità
>degl' hard disck non c'è piu stata questa limitazione.
Guarda.. non ho MAI e dico MAI usato il primo approccio..
Sempre Chiave (o surrogata) e Descrizione.
L'update è sempre sulla descrizione e mai sulla chiave, che rimane quella.

>ho provato a modificare l'update in
>UPDATE [TElencoNazioni] set [nazione]=@nazione where [nazione]=@original_nazione
>ma va in errore perchè non conosce @original_nazione

>Rimanendo nel primo caso di tabella, la mia attuale, come dovrei
>scrivere l'update affinchè possa modificare il campo?
Beh.. devi definire nel datasource tutti e due i parametri.. e poi valorizzarli all'atto dell'aggiornamento..

>grazie ciao
di nulla!
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Devil Profilo | Junior Member

effettivamente adesso che ci penso anche in db che sto utilizzando, in un'altro software realizzato da un'azienda esterna alla mia, questo approccio non esiste....

comunque, ipotizzando di tenere la rotta che ho intrapreso riesci ad essere più preciso?

cosa intendi per definire e valorizzare entrambi i parametri?

@nazione è gia definito, mentre @original_nazione pensavo lo prendesse in automatico....oppure è proprio sbagliato il modo di scrivere la query?
come la scriveresti?

alx_81 Profilo | Guru

>@nazione è gia definito, mentre @original_nazione pensavo lo
>prendesse in automatico....oppure è proprio sbagliato il modo
>di scrivere la query?
>come la scriveresti?
Posta il datasource come l'hai creato.. TUTTO..
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Devil Profilo | Junior Member

occhio che il mio era un esempio, comunque è fatto così

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:dominoConnectionString %>"
DataSourceMode="DataSet"

SelectCommand="SELECT [tipoRilascio] FROM [TTipiRilascio]"
updateCommand="UPDATE [TTipiRilascio] set [tipoRilascio]=@tipoRilascio where [tipoRilascio]=@original_tipoRilascio"
>
<UpdateParameters>
<asp:Parameter type="string" Name="tipoRilascio"/>
</UpdateParameters>
</asp:SqlDataSource>

non cambia molto il fatto che la tabella si chiama TTipiRilascio ed è composta da campo chiave primaria tipoRilascio.
per farti capire tutto il contesto è una di tante tabelle collegate ad una tabella principale che contiene delle valutazioni su rilievi ambientali relativi all'amianto

alx_81 Profilo | Guru

>occhio che il mio era un esempio, comunque è fatto così
eh lo so.. ma ora ho capito dove sbagli

> <UpdateParameters>
> <asp:Parameter type="string" Name="tipoRilascio"/>
> </UpdateParameters>
manca la definizione dell'altro parametro di update, ovvero original_TipoRilascio

<asp:Parameter type="string" Name="original_tipoRilascio"/>

Aggiungilo e poi devi però valorizzarlo, nell'evento di aggiornamento del controllo che usa il datasource.
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Devil Profilo | Junior Member

"nell'evento di aggiornamento del controllo che usa il datasource."...ehhh?

cioè dovrei settarne il valore nel momento in cui aggiorno la gridview(il controllo)?
o mi memorizzo il valore da qualche parte tipo una textbox o non so...qualcosa non mi quadra...

se riesci prova ad indicarmi i passaggi e io provo a scrivere il codice e poi...

facciamo così... domattina ci riprovo..magari con la mente fresca mi viene meglio...mi spiace farti perdere troppo tempo..scusami

ti faccio vedere il tutto così magari è più chiaro

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" AutoGenerateEditButton="true" DataKeyNames="tipoRilascio"
DataSourceID="SqlDataSource1" Width="354px">
<Columns>
<asp:BoundField DataField="tipoRilascio" HeaderText="tipoRilascio"
SortExpression="tipoRilascio" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:dominoConnectionString %>"
DataSourceMode="DataSet"

SelectCommand="SELECT [tipoRilascio] FROM [TTipiRilascio]"
updateCommand="UPDATE [TTipiRilascio] set [tipoRilascio]=@tipoRilascio where [tipoRilascio]=@original_tipoRilascio"
>
<UpdateParameters>
<asp:Parameter type="string" Name="tipoRilascio"/>
</UpdateParameters>
</asp:SqlDataSource>

ciao ciao

alx_81 Profilo | Guru

>"nell'evento di aggiornamento del controllo che usa il datasource."...ehhh?
>cioè dovrei settarne il valore nel momento in cui aggiorno la
>gridview(il controllo)?
esatto.. per me il controllo è quello che usa il datasource e quindi il gridview.
All'evento dell'aggiornamento (RowUpdating - http://msdn.microsoft.com/it-it/library/system.web.ui.webcontrols.gridview.rowupdating(VS.80).aspx) vai a valorizzare il parametro. Occhio però perchè il parametro VA DEFINITO negli UpdateParameters del tuo DataSource, e come vedo per ora non l'hai ancora aggiunto.

>o mi memorizzo il valore da qualche parte tipo una textbox o
>non so...qualcosa non mi quadra...
Ovviamente, quando premi "Edit" ti deve comparire la textbox con la possibilità di inserire il nuovo valore che vuoi (magari proponendo il vecchio).
Premendo poi "Aggiorna" si scatena l'evento RowUpdating in cui tu valorizzerai il parametro original_tipoRilascio.



>ciao ciao
ciao!

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Devil Profilo | Junior Member

Buongiorno...forse ci sono quasi...

..sistemato il dataSource...
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:dominoConnectionString %>"
DataSourceMode="DataSet"
SelectCommand="SELECT [tipoRilascio] FROM [TTipiRilascio]"
updateCommand="UPDATE [TTipiRilascio] set [tipoRilascio]=@tipoRilascio where [tipoRilascio]=@original_tipoRilascio"
>
<UpdateParameters>
<asp:Parameter type="string" Name="tipoRilascio"/>
<asp:Parameter type="string" Name="original_tipoRilascio" />
</UpdateParameters>
</asp:SqlDataSource>


sono riuscito a recuperare il vecchio valore dalla gridView, non so se il modo in cui l'ho fatto è quello più giusto o se ne esistono altri, comunque sia sono arrivato qua:

Protected Sub GridView1_RowUpdated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdatedEventArgs) Handles GridView1.RowUpdated

Dim oldValue As String = ""
'memorizzo il vecchio valore
Dim keyEntry As DictionaryEntry
For Each keyEntry In e.Keys

oldValue = keyEntry.Value

Next keyEntry
'Devo settare il parametro del comando upadate del dataSource
Me.SqlDataSource1.UpdateParameters ??????? = oldValue

End Sub


qual è il modo di settare il parametro original_tipoRilascio..come vi si accede?

fatto questo dovrebbe funzionare o è necessario fare altri passi?

alx_81 Profilo | Guru

>Buongiorno...forse ci sono quasi...
Ciao!
>
>qual è il modo di settare il parametro original_tipoRilascio..come
>vi si accede?
perchè non leggi i link che ti posto???
http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.rowupdating.aspx

RowUpdating!!


--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Devil Profilo | Junior Member

Ciao..abbi pazienza...
il link l'ho letto, o per lo meno ho tentato di capirlo. (Con l'inglese faccio schifo e il codice non è immediato)

Ci sono due esempi:il primo usa il dataSource e usa il comando update il secondo fa tutto da codice sia creazione che aggiornamento.

Tu mi hai detto di inserire il parametro nel datasource ma anche di usare l'evento rowUpdate...questo mi ha creato confusione.

ho notato del codice nel 1°esempio:

Sub CustomersGridView_RowUpdating(ByVal sender As Object, ByVal e As GridViewUpdateEventArgs)
Dim records(e.NewValues.Count - 1) As DictionaryEntry
e.NewValues.CopyTo(records, 0)
Dim entry As DictionaryEntry
For Each entry In records
e.NewValues(entry.Key) = Server.HtmlEncode(entry.Value.ToString())
Next
End Sub

ma non mi sembra abbia a che fare con quello che voglio io..o sbaglio?

Ho provato ad utilizzarlo nel mio Row_Updated ma non fa nulla anche se effettivamente il codice viene eseguito.

Sicuramente sbaglio qualcosa ...ma cosa?








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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5