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
[VB2005+SQL] un consiglio per favore...
giovedì 27 agosto 2009 - 13.04
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
reru
Profilo
| Newbie
37
messaggi | Data Invio:
gio 27 ago 2009 - 13:04
1134_Prova.zip
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
385
messaggi | Data Invio:
gio 27 ago 2009 - 17:27
>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
37
messaggi | Data Invio:
ven 28 ago 2009 - 08:16
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
385
messaggi | Data Invio:
ven 28 ago 2009 - 09:04
>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
37
messaggi | Data Invio:
ven 28 ago 2009 - 09:59
Grazie nuovamente e buon lavoro anche a te
RZ
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 !