Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
SQL Server 2000/2005/2008, Express, Access, MySQL, Oracle
Query di update...
mercoledì 14 giugno 2006 - 15.40
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
PEPE
Profilo
| Senior Member
296
messaggi | Data Invio:
mer 14 giu 2006 - 15:40
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
7.999
messaggi | Data Invio:
gio 15 giu 2006 - 08:21
>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
296
messaggi | Data Invio:
gio 15 giu 2006 - 10:19
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
7.999
messaggi | Data Invio:
gio 15 giu 2006 - 10:37
>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/
Torna su
Stanze Forum
Elenco Threads
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 !