Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1908, comments - 2047, trackbacks - 352

My Links

News

Your host

This is me! Questo spazio è dedicato a Microsoft® .NET®, di cui sono molto appassionato :-)

Cookie e Privacy

Disabilita cookie ShinyStat

Microsoft MVP

My MVP Profile

Microsoft Certified Professional

Microsoft Specialist

Xamarin Certified Mobile Developer

Il mio libro su VB 2015!

Pre-ordina il mio libro su VB 2015 Pre-ordina il mio libro "Visual Basic 2015 Unleashed". Clicca sulla copertina per informazioni!

Il mio libro su WPF 4.5.1!

Clicca sulla copertina per informazioni! E' uscito il mio libro "Programmare con WPF 4.5.1". Clicca sulla copertina per informazioni!

These postings are provided 'AS IS' for entertainment purposes only with absolutely no warranty expressed or implied and confer no rights.
If you're not an Italian user, please visit my English blog

Le vostre visite

I'm a VB!

Guarda la mia intervista a Seattle

Follow me on Twitter!

Altri spazi

GitHub
I miei progetti open-source su GitHub

Article Categories

Archives

Post Categories

Image Galleries

Privacy Policy

LINQ-to-SQL: secondo esempio di Optimistic Concurrency

Riprendo un esempio di codice illustrato in un post di qualche giorno fa, in cui abbiamo visto come, tramite il concetto di Optimistic Concurrency, LINQ-to-SQL fornisca delle modalità per risolvere il problema dell'invio di modifiche al database da parte di più utenti connessi.

Ancora una volta sfruttiamo l'eccezione ChangeConflictException nell'ambito di un esempio di codice Visual Basic, puramente dimostrativo, in cui un primo utente predispone aggiornamenti per un prodotto nel database Northwind, un secondo utente predispone aggiornamenti al medesimo prodotto e li invia al database, il primo utente invia i propri cambiamenti al database:

    Sub Main()

 

        'Altra istanza del DataContext

        Dim nuovoUtenteDc = New NorthwindDataContext()

 

        'Ottengo la row relativa al prodotto "Tofu"

        Dim prodotto = dc.Products.First(Function(p) p.ProductID = 14)

 

        'Ottengo la row relativa al prodotto "Tofu"

        Dim prodottoNuovoUtente = nuovoUtenteDc.Products.First(Function(p) p.ProductID = 14)

 

        'Il secondo utente invia delle modifiche al database

        prodottoNuovoUtente.UnitPrice = 22.5D

        prodottoNuovoUtente.UnitsInStock = 20

        nuovoUtenteDc.SubmitChanges()

 

        'Poi le invia anche il primo utente

        prodotto.UnitPrice = 24.05D

        prodotto.UnitsOnOrder = 40

 

        Try

            'L'utente originario prova a inviare i cambiamenti

            dc.SubmitChanges()

 

        Catch c As ChangeConflictException

            'Mantiene le modifiche e le unisce a quelle non coincidenti degli altri

            dc.ChangeConflicts.ResolveAll(RefreshMode.KeepChanges)

            dc.SubmitChanges()

        End Try

 

    End Sub

Anche in questo caso la situazione è quella in cui il primo utente richiede la persistenza dei dati. A questo punto viene sollevata una ChangeConflictException, poiché i valori del database sono stati aggiornati dall’ultima lettura del client. Ancora una volta sfruttiamo il metodo ResolveAll della proprietà ChangeConflicts per risolvere quanto sollevato dalla ChangeConflictException. Stavolta, però, utilizziamo il valore KeepChanges dell’enumerazione RefreshMode, che permette di conservare i cambiamenti effettuati dall'utente corrente e di unirli alle modifiche inviate dagli altri utenti, purchè queste non coincidano coi campi modificati dal primo utente.

Alessandro

Print | posted on mercoledì 21 maggio 2008 20:00 | Filed Under [ Visual Basic LINQ ]

Powered by:
Powered By Subtext Powered By ASP.NET