Query di update...

mercoledì 14 giugno 2006 - 15.40

PEPE Profilo | Senior Member

Cia a tutti,
ho una piccolo quesito che vorrei chiarire.

ho una query di Update impostata in questo modo:

UPDATE NarStabilimento SET oggetto=@OBJN WHERE idProgressivo=@IDPROG AND oggetto=@OBJO

OBJO e OBJN sarebbero i due valori presi dal campo di una riga...rispettivamente original e current.

Quindi la query aggiorna il contenuto del campo solamente se il valore presente nel db non è variato durante la sessione di modifica.
Vabbe cmq il mio problema e' che dato che il campo oggetto è di tipo ntext, questa query di update non mi funziona. Se levo l'ultima parte, AND oggetto=@OBJO, ovviamente tutto funziona tranquillamente. Posso immaginare quindi che la query non riesce a fare un confronto tra il campo ntext ed il contenuto del parametro OBJO.
Come si puo' rimediare?

Brainkiller Profilo | Guru

>Come si puo' rimediare?

Se idProgressivo è la Primary Key, che quindi identifica univocamente un campo, a cosa serve una ulteriore condizione nel Where ?
Ciao

David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/

PEPE Profilo | Senior Member

Perche in questo modo sono sicuro che il campo oggetto non è stato modificato durante la mia fase di modifica da un altro utente.

In pratica quando faccio la select ottengo il contenuto del record. Supponiamo che oggetto sia 'Ciao'
Un altro utente visualizza gli stessi dati quindi anche il secondo utente vede 'Ciao'

Quando io modofico il dato con 'Ciao Luca' e lo aggiorno al datarow ottengo 2 versioni: row("oggetto", current) che ha 'Ciao Luca' e row("oggetto", original) che ha 'Ciao'

Questi 2 valori li metto nei parametri OBJN ed OBJO. Quando faccio l'update aggiorno il db con il nuovo valore 'Ciao Luca'

Ora ritorniamo sull'utente 2. Lui modifica il dato con 'Ciao David'. Quindi il rowstate original è 'Ciao' ed il current e 'Ciao David'.

Quando va a fare l'update quell' AND oggetto=@OBJO va a verificare se il campo oggetto ha come contenuto 'Ciao'. Dato che io ho modoficato il dato con 'Ciao Luca' la condizione non è verificata allora so che un'altro utente ha modificato il dato e posso gestire la concorrenza.

Cmq ho provato a mettere il campo oggetto come varchar(100), e tutto funziona bene. Sinceramente potrei anche lasciare il campo cosi' e verificare il numero di caratteri che l'utente inserisce ma cmq mi incuriosiva il fatto che con il tipo ntext non si riesca a fare un confronto.

Brainkiller Profilo | Guru

>In pratica quando faccio la select ottengo il contenuto del record.
>Supponiamo che oggetto sia 'Ciao'
>Un altro utente visualizza gli stessi dati quindi anche il secondo
>utente vede 'Ciao'
>Quando io modofico il dato con 'Ciao Luca' e lo aggiorno al datarow
>ottengo 2 versioni: row("oggetto", current) che ha 'Ciao Luca'
>e row("oggetto", original) che ha 'Ciao'

Ma secondo te le transazioni e la concorrenza perchè le hanno inventate ?
Se tu metti queste query dentro una transazione che fa il primo utente, il secondo non può modificare/leggere i dati sottostanti finchè il primo utente committa la transazione o fa un rollback. Nella fatispecie invece da te ipotizzata c'è la questione della concorrenza, ossia se due utenti prendono lo stesso dato e uno fa una modifica prima dell'altro, poi .NET prima di fare update ti segnala che i dati sono variati e va in eccezione, e tu qui devi gestire la cosa e segnalare all'utente che nel frattempo i dati sono cambiati. Quindi accettare comunque le modifiche fatte o recuperare il valore nuovo.
Ciao

David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/
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