24 messaggi dal 06 novembre 2014
Ciao a tutti, sto realizzando una web application in asp.net con sqlServer, in diverse maschere sto utilizzando le Listview per inserire e aggiornare i record del database, tuttavia ho riscontrato un problema con l'aggiornamento dei record in un caso.
La listview viene creata con la procedura guidata, utilizzando sqldatasource, generando automaticamente le istruzioni insert e update e utilizzando l'optimistic concurrency.
Uno dei campi della tabella dovrebbe essere aggiornato in base ad un valore che passo in fase di update (nell'evento Listview_itemUpdating); al momento sto utilizzando l'espressione

sqldatasource.updateparameters("nome_parametro").defaultvalue=valore_parametro

che funziona SE E SOLO SE il campo della tabella a cui fa riferimento il parametro e' vuoto. In caso il valore del campo non sia null o vuoto tutta la modifica del record non viene eseguita. Facendo un po' di prove ho l'impressione che qualcosa non funzioni a causa dell'impostazione dell'optimistic concurrency, ma non so come uscirne.

Qualcuno mi puo' aiutare?

Grazie,

Paolo
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Paolo,

papell ha scritto:

Uno dei campi della tabella dovrebbe essere aggiornato in base ad un valore che passo in fase di update

In questo caso prova ad agire sui parametri del SqlCommand che sta per essere inviato al database, e non sul parametro del SqlDataSource.

Arrivi al SqlCommand dal parametro di tipo SqlDataSourceCommandEventArgs del metodo che hai legato all'evento Updating.
Ad esempio:
protected void OnSqlUpdating(Object source, SqlDataSourceCommandEventArgs e) {
  e.Command.Parameters["NomeParametro"].Value = valore_parametro;
}


In generale, metti un breakpoint su quell'istruzione e vai ad ispezionare la collezione e.Command.Parameters per capire che parametri sono stati aggiunti al suo interno. Dato che stai usando l'optimistic concurrency, dovresti trovare due parametri per ogni campo: uno che reca il nuovo valore e uno con il valore precedente. Esamina i loro nomi per capire quale va modificato.

ciao,
Moreno

Enjoy learning and just keep making
24 messaggi dal 06 novembre 2014
Ciao Moreno,

BrightSoul ha scritto:


In generale, metti un breakpoint su quell'istruzione e vai ad ispezionare la collezione e.Command.Parameters per capire che parametri sono stati aggiunti al suo interno. Dato che stai usando l'optimistic concurrency, dovresti trovare due parametri per ogni campo: uno che reca il nuovo valore e uno con il valore precedente. Esamina i loro nomi per capire quale va modificato.


Ti ringrazio del suggerimento, i due parametri sono distinti come da prassi uno con e uno senza il prefisso "original_", ovviamente sono andato a modificare il parametro "non original" con il metodo che mi hai suggerito nell'evento sqldatasource_updating.
Purtroppo il problema non si risolve, la riga della listview non viene aggiornata, proprio come se si ponesse un problema di optimistic concurrency che rifiuta l'aggiornamento della riga.
In realtà con questo metodo sto cercando di aggiornare due campi updated_by e updated_date della tabella per rilevare autore e data dell'ultima modifica del record. Ci potrebbe essere un metodo alternativo per fare lo stesso lavoro? Utilizzo EF per operare sul database e Identity 2.

Grazie

Paolo
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Paolo,

papell ha scritto:

Purtroppo il problema non si risolve, la riga della listview non viene aggiornata, proprio come se si ponesse un problema di optimistic concurrency che rifiuta l'aggiornamento della riga.

Se la riga non viene aggiornata, è probabile che la clausola WHERE del comando UPDATE contiene dei valori non più attuali o vuoti.
Usa il debugger (come hai già fatto) per ispezionare il valore tutti di parametri "original_" presenti nel SqlCommand. E' possibile che uno di essi non corrisponda al valore che si trova nel database.

L'optimistic concurrency consiste nel fatto che la riga verrà aggiornata solo se tali valori, che vengono usati nella clausola WHERE, corrispondono esattamente a quelli presenti nel db.
Cerca di capire qual è di questi valori a non corrispondere.
Eventualmente esamina anche il CommandText del SqlCommand, così ti rendi conto di quale sia l'esatto comando che viene inviato al db.

papell ha scritto:

Utilizzo EF

Con Entity Framework in alternativa puoi usare l'EntityDataSource (che supporta EF6 se installi il framework 4.6 o se lo scarichi da NuGet).
Volendo nella tabella del DB ti puoi creare un campo Timestamp e usare solo quello come criterio di verifica per l'optimistic concurrency (dato che viene automaticamente aggiornato ad ogni aggiornamento). Se usi l'approccio codice first, leggi qui.

ciao,
Moreno
Modificato da BrightSoul il 21 agosto 2015 16.11 -

Enjoy learning and just keep making
24 messaggi dal 06 novembre 2014
BrightSoul ha scritto:


L'optimistic concurrency consiste nel fatto che la riga verrà aggiornata solo se tali valori, che vengono usati nella clausola WHERE, corrispondono esattamente a quelli presenti nel db.


Risolto, il campo incriminato era updated_date, infatti utilizzando System.date.today anziché system.date.now tutto funziona perfettamente.
Purtroppo è una sottigliezza che non colgo, possibile che la presenza di ore-min-sec nella data causi una differenza tra il valore rilevato nel campo e il valore "original_" che in teoria dovrebbero essere identici perché inseriti nello stesso istante?
Comunque tant'è, per fortuna in questo caso non è necessaria una tale precisione nel rilevamento degli aggiornamenti dei record, ma è comunque un aspetto che mi piacerebbe chiarire.

Grazie mille dell'aiuto!

Paolo

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.