[VB2005+SQL] un consiglio per favore...

giovedì 27 agosto 2009 - 13.04

reru Profilo | Newbie

Salve a tutti,

ho un problema per la modifica dei dati su un db SQL in multiutenza (purtroppo fino ad ora usavo ACCESS).
In pratica vorrei che, se due o più utenti vogliono modificare un record del db, solo il primo possa farlo inibendo agli altri questa possibilità.
Ho letto qualcosa (commit,rollback) ma non riesco a capire come applicarli.
Allego una semplice prova nella quale ho inserito una listview, usata per ricercare il codice da modificare, una textbox dove mostro la descrizione da modificare ed un pulsante per salvare la modifica.
Lo stesso concetto lo vorrei estendere anche alla cancellazione.

Potete aiutarmi per favore ?

grazie a tutti
RZ

micto27 Profilo | Senior Member

>Salve a tutti,
>
>ho un problema per la modifica dei dati su un db SQL in multiutenza
>(purtroppo fino ad ora usavo ACCESS).
>In pratica vorrei che, se due o più utenti vogliono modificare
>un record del db, solo il primo possa farlo inibendo agli altri
>questa possibilità.
>Ho letto qualcosa (commit,rollback) ma non riesco a capire come
>applicarli.
>Allego una semplice prova nella quale ho inserito una listview,
>usata per ricercare il codice da modificare, una textbox dove
>mostro la descrizione da modificare ed un pulsante per salvare
>la modifica.
>Lo stesso concetto lo vorrei estendere anche alla cancellazione.
>
>Potete aiutarmi per favore ?
>
>grazie a tutti
>RZ

Ciao, io in casi del genere (con Sql Server) mi appoggio ad una colonna di tipo Timestamp, visto che Sql Server la gestisce in modo automatico:

ipotizza che la tabella LIBRI abbia come chiave una colonna ID e che a tale tabella tu aggiungi una colonna di tipo Timestamp.

A questo punto si tratta, per le operazioni di UPDATE e DELETE, di aggiungere alle condizioni WHERE tipicamente mirate sulla chiave primaria
una condizione sulla colonna Timestamp, ponendo la clausola che il valore del timestamp sia lo stesso che era stato letto al momento dell'acquisizione dati:

l'utente 1acquisisce i dati del libro 123 e il timestamp vale 678
anche l'utente 2 acquisisce i dati dello stesso libro
l'utente 2 modifica e salva i dati del libro 123 e sql server modifica automaticamente il valore della colonna timestamp (che ora vale ad esempio 887)
a questo anche l'utente 1 prova a modificare lo stesso libro, ma la sua UPDATE (... WHERE ID=123 AND Timestamp=678) fallisce in quanto ora abbiamo detto che il timestamp è stato modificato dall'UPDATE dell'utente 2.

Fra l'altro la colonna timestamp, essendo gestita direttamente dal database, ti garantisce anche nel caso la riga del suddetto libro 123 fosse modificata al di fuori della tua applicazione,
con un qualsiasi client che consenta l'aggiornamento dei dati.
Spero di aver reso l'idea.
Buon lavoro, Michele

P.S. nell'esempio ho trattato la colonna timestamp come se fosse un numero anche se in realtà è un valore binario, comunque acquisendo i dati della riga puoi convertire (per comodità) il timestamp
in un intero (CONVERT(int, colonnaTimestamp):

SELECT ID, Titolo, Autore, convert(int, colonnaTimestamp) as RowTS FROM LIBRI WHERE ID = 123.....

reru Profilo | Newbie

Grazie mille per il tuo prezioso suggerimento, in effetti pensavo a qualcosa del genere (mi conforta non essere l'unico...).
Solo un dubbio, se hai tempo/voglia, dato che si lavora in modalità disconnessa, se un utente, per esempio, genera una query di ricerca che soddisfa la maggior parte delle sue esigenze, ad esempio al mattino appenna entrato in ufficio, e poi visualizare quei risulati per tutto il giorno, esiste la possibilità che lavori su dati non aggiornati o sbaglio (ovviamente se da qualche altra parte uno mi aggiorna uno u più dati contenuti in quella query).
Come si può ovviare eventualmente a questo ?

Grazie mille nuovamente per il tuo interessamento
RZ

micto27 Profilo | Senior Member

>Grazie mille per il tuo prezioso suggerimento, in effetti pensavo
>a qualcosa del genere (mi conforta non essere l'unico...).
>Solo un dubbio, se hai tempo/voglia, dato che si lavora in modalità
>disconnessa, se un utente, per esempio, genera una query di ricerca
>che soddisfa la maggior parte delle sue esigenze, ad esempio
>al mattino appenna entrato in ufficio, e poi visualizare quei
>risulati per tutto il giorno, esiste la possibilità che lavori
>su dati non aggiornati o sbaglio (ovviamente se da qualche altra
>parte uno mi aggiorna uno u più dati contenuti in quella query).
>Come si può ovviare eventualmente a questo ?
>

potresti pensare ad introdurre un timer
che potrebbe:
o rinfrescare direttamente i dati
o eseguire una query di verifica (basandosi magari sul MAX della colonna timestamp in base alla WHERE applicata in acquisizione dati)
e se si riscontra che tale MAX(Timestamp) è cambiato rispetto al momento in cui i dati sono stati caricati allora eseguire o proporre di eseguire
il rinfresco dei dati a video.

>Grazie mille nuovamente per il tuo interessamento
>RZ
prego

Buon lavoro, Michele

reru Profilo | Newbie

Grazie nuovamente e buon lavoro anche a te

RZ
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