Condividi tramite


Procedura dettagliata: estensione della cache del database locale per supportare la sincronizzazione bidirezionale

È possibile aggiungere un elemento Cache database locale al progetto per configurare una cache di database SQL Server Compact 3.5 locale e generare un set di classi parziali che abilitano Servizi di sincronizzazione Microsoft per ADO.NET. Dal momento che Visual Studio consente di generare classi parziali, è possibile scrivere codice per aggiungere la funzionalità di sincronizzazione e mantenere comunque la possibilità di visualizzare e modificare le impostazioni nella finestra di dialogo Configura sincronizzazione dati. Per ulteriori informazioni sulle classi parziali, vedere Procedura: dividere una classe in classi parziali (Progettazione classi).

Per impostazione predefinita, la finestra di dialogo Configura sincronizzazione dati consente di configurare i Servizi di sincronizzazione solo per il download. In tal caso, dopo aver configurato la sincronizzazione dei dati, chiamando l'oggetto Synchronize() verranno scaricate solo le modifiche dal server al database client. La configurazione della sincronizzazione bidirezionale rappresenta uno dei modi più comuni per estendere il codice di sincronizzazione. In questo modo è possibile caricare le modifiche dal client al server. Per abilitare la sincronizzazione bidirezionale, è consigliabile estendere il codice generato nei modi seguenti:

  • Impostare la direzione di sincronizzazione su bidirezionale.

  • Aggiungere il codice per gestire i conflitti di sincronizzazione.

  • Rimuovere le colonne di rilevamento del server dai comandi di sincronizzazione.

Prerequisiti

Prima di iniziare questa procedura dettagliata, è necessario completare la Procedura dettagliata: creazione di un'applicazione connessa occasionalmente. Dopo aver completato tale procedura, si dispone di un progetto che include un elemento Cache database locale e un'applicazione Windows Form che consente di scaricare le modifiche dalla tabella Northwind Customers a un database di SQL Server Compact. Ora è possibile caricare questa soluzione della procedura dettagliata e aggiungere la funzionalità bidirezionale.

Nota

Nel computer in uso è possibile che vengano visualizzati nomi o percorsi diversi per alcuni elementi dell'interfaccia utente di Visual Studio nelle istruzioni seguenti. La versione di Visual Studio in uso e le impostazioni configurate determinano questi elementi. Per ulteriori informazioni vedere Impostazioni di Visual Studio.

Per aprire la soluzione OCSWalkthrough

  1. Aprire Visual Studio

  2. Nel menu File, aprire una soluzione esistente o un progetto e individuare la soluzione OCSWalkthrough. Si tratta del file OCSWalkthrough.sln.

Impostazione della direzione di sincronizzazione

La finestra di dialogo Configura sincronizzazione dati consente di impostare la proprietà SyncDirection() sull'oggetto DownloadOnly() o Snapshot(). Per abilitare la sincronizzazione bidirezionale, impostare la proprietà SyncDirection() sull'oggetto Bidirectional() per ogni tabella che si desidera attivare per il caricamento delle modifiche.

Per impostare la direzione di sincronizzazione

  1. Fare clic con il pulsante destro del mouse su NorthwindCache.sync, quindi scegliere Visualizza codice. In occasione della prima esecuzione di questa operazione, Visual Studio consente di creare un file NorthwindCache nel nodo NorthwindCache.sync in Esplora soluzioni. In questo file è contenuta una classe parziale NorthwindCacheSyncAgent e, se necessario, è possibile aggiungerne altre.

  2. Nel file della classe NorthwindCache, aggiungere il codice in modo che il metodo NorthwindCacheSyncAgent.OnInitialized() sia simile al codice seguente:

    partial void OnInitialized()
    {
        this.Customers.SyncDirection = 
        Microsoft.Synchronization.Data.SyncDirection.Bidirectional;
    }
    
    Private Sub OnInitialized()
        Me.Customers.SyncDirection = 
        Microsoft.Synchronization.Data.SyncDirection.Bidirectional
    End Sub
    
  3. Aprire Form1 nell'editor del codice.

  4. Nel file Form1, modificare la riga di codice nel gestore eventi SynchronizeButton_Click in modo che includa statistiche di caricamento e download:

    MessageBox.Show("Changes downloaded: " +
        syncStats.TotalChangesDownloaded.ToString() + 
        Environment.NewLine +
        "Changes uploaded: " + 
        syncStats.TotalChangesUploaded.ToString());
    
    MessageBox.Show("Changes downloaded: " & _
        syncStats.TotalChangesDownloaded.ToString & _
        Environment.NewLine & _
        "Changes uploaded: " & _
        syncStats.TotalChangesUploaded.ToString)
    

Verifica dell'applicazione

Ora l'applicazione è configurata per eseguire sia caricamenti, sia download durante la sincronizzazione.

Per eseguire il test dell'applicazione

  1. Premere F5.

  2. Nel form, aggiornare un record, quindi scegliere il pulsante Salva (icona del disco nella barra degli strumenti).

  3. Scegliere Sincronizza.

  4. Verrà visualizzata una finestra di messaggio contenente le informazioni sui record sincronizzati. Nelle statistiche viene mostrato che una riga è stata caricata e un'altra scaricata, anche se non sono state apportate modifiche al server. Si verifica un download aggiuntivo poiché le modifiche del client vengono restituite al client una volta applicate al server. Per ulteriori informazioni, vedere "Determinazione del client che ha apportato una modifica ai dati" in Procedura: utilizzare un sistema di rilevamento delle modifiche personalizzato.

  5. Scegliere OK per chiudere la finestra di messaggio mantenendo l'esecuzione dell'applicazione.

A questo punto verrà modificato lo stesso record sia sul client, sia sul server per imporre un conflitto (violazione di concorrenza) durante la sincronizzazione.

Per eseguire il test dell'applicazione e imporre un conflitto

  1. Nel form, aggiornare un record, quindi scegliere il pulsante Salva.

  2. Con l'applicazione ancora in esecuzione, utilizzare Esplora server/Esplora database o un altro strumento di gestione di database per connettersi al database del server.

  3. Per dimostrare il comportamento predefinito per la risoluzione dei conflitti, in Esplora server/Esplora database, aggiornare lo stesso record aggiornato nel form, ma impostarlo su un valore diverso ed eseguire il commit della modifica (uscire dalla riga modificata).

  4. Tornare al form e scegliere Sincronizza.

  5. Verificare l'aggiornamento nella griglia dell'applicazione e nel database del server. Notare che l'aggiornamento effettuato nel server ha sovrascritto l'aggiornamento nel client. Per informazioni sulla modifica di questo comportamento della risoluzione dei conflitti, vedere la prossima sezione di questo argomento, "Aggiunta del codice per gestire i conflitti di sincronizzazione".

Aggiunta del codice per gestire i conflitti di sincronizzazione

In Servizi di sincronizzazione una riga è in conflitto se è stata modificata sia sul client che sul server tra le sincronizzazioni. In Servizi di sincronizzazione vengono viene fornito un set di funzionalità necessarie per rilevare e risolvere i conflitti. In questa sezione, verrà aggiunta la gestione di base per i conflitti nei quali la stessa riga viene aggiornata nel client e nel server. Gli altri tipi di conflitti includono una riga eliminata in un database e aggiornata in un altro oppure righe che dispongono di chiavi primarie duplicate inserite in entrambi i database. Per ulteriori informazioni sul rilevamento e sulla risoluzione dei conflitti, vedere Procedura: gestire i conflitti di dati e gli errori.

Nota

Nel codice di esempio viene fornita una dimostrazione di base relativa alla gestione dei conflitti. La modalità di gestione dei conflitti dipende dai requisiti dell'applicazione e dalla logica di business.

Aggiungere il codice per gestire l'evento ApplyChangeFailed del server e l'evento ApplyChangeFailed del client. Questi eventi vengono generati quando una riga non può essere applicata a causa di un conflitto o di un errore. I metodi che gestiscono questi eventi verificano il tipo di conflitto e specificano che i conflitti di aggiornamento del server/client devono essere risolti imponendo la scrittura della modifica del client nel database del server. Nel comando di sincronizzazione che consente di applicare gli aggiornamenti al database del server è inclusa la logica che permette di riconoscere il momento in cui una modifica deve essere imposta. Questo comando è incluso nel codice della prossima sezione di questo argomento, "Rimozione delle colonne di rilevamento del server dai comandi di sincronizzazione".

I passaggi da eseguire per aggiungere la gestione dei conflitti sono diversi a seconda che si utilizzi C# o Visual Basic.

Per aggiungere la gestione dei conflitti

  • Se si utilizza C#, aggiungere il codice a NorthwindCache.cs e Form1.cs. In NorthwindCache.cs, aggiungere il codice seguente dopo la fine della classe NorthwindCacheSyncAgent:

    public partial class NorthwindCacheServerSyncProvider
    {
    
        partial void OnInitialized()
        {
            this.ApplyChangeFailed +=
                new System.EventHandler<Microsoft.Synchronization.Data.ApplyChangeFailedEventArgs>
                (NorthwindCacheServerSyncProvider_ApplyChangeFailed);
        }
    
        private void NorthwindCacheServerSyncProvider_ApplyChangeFailed(object sender,
            Microsoft.Synchronization.Data.ApplyChangeFailedEventArgs e)
        {
    
        if (e.Conflict.ConflictType ==
            Microsoft.Synchronization.Data.ConflictType.ClientUpdateServerUpdate)
            {
    
            // Resolve a client update / server update conflict by force writing
            // the client change to the server database.
            System.Windows.Forms.MessageBox.Show("A client update / server update conflict " +
                                                    "was detected at the server.");
            e.Action = Microsoft.Synchronization.Data.ApplyAction.RetryWithForceWrite;
    
            }
    
        }
    }
    
    public partial class NorthwindCacheClientSyncProvider
    {
    
        public void AddHandlers()
        {
            this.ApplyChangeFailed +=
                new System.EventHandler<Microsoft.Synchronization.Data.ApplyChangeFailedEventArgs>
                (NorthwindCacheClientSyncProvider_ApplyChangeFailed);
        }
    
        private void NorthwindCacheClientSyncProvider_ApplyChangeFailed(object sender,
            Microsoft.Synchronization.Data.ApplyChangeFailedEventArgs e)
        {
    
            if (e.Conflict.ConflictType ==
                Microsoft.Synchronization.Data.ConflictType.ClientUpdateServerUpdate)
            {
    
                // Resolve a client update / server update conflict by keeping the 
                // client change.
                e.Action = Microsoft.Synchronization.Data.ApplyAction.Continue;
    
            }
    
        }
    }
    

    In Form1.cs, modificare il codice nel gestore eventi SynchronizeButton_Click in modo che venga chiamato il metodo AddHandler aggiunto a NorthwindCache.cs nel passaggio precedente:

    NorthwindCacheSyncAgent syncAgent = new NorthwindCacheSyncAgent();
    
    NorthwindCacheClientSyncProvider clientSyncProvider =
        (NorthwindCacheClientSyncProvider)syncAgent.LocalProvider;
    clientSyncProvider.AddHandlers();
    
    Microsoft.Synchronization.Data.SyncStatistics syncStats = 
        syncAgent.Synchronize();
    
  • Se si utilizza Visual Basic, in NorthwindCache.vb aggiungere il codice seguente dopo l'istruzione End Class per la classe NorthwindCacheSyncAgent.

    Partial Public Class NorthwindCacheServerSyncProvider
    
        Private Sub NorthwindCacheServerSyncProvider_ApplyChangeFailed( _
            ByVal sender As Object, ByVal e As  _
            Microsoft.Synchronization.Data.ApplyChangeFailedEventArgs) _
            Handles Me.ApplyChangeFailed
    
            If e.Conflict.ConflictType = _
                Microsoft.Synchronization.Data.ConflictType.ClientUpdateServerUpdate Then
    
                ' Resolve a client update / server update conflict by force writing
                ' the client change to the server database.
                MessageBox.Show("A client update / server update" & _
                    " conflict was detected at the server.")
                e.Action = Microsoft.Synchronization.Data.ApplyAction.RetryWithForceWrite
    
            End If
    
        End Sub
    
    End Class
    
    Partial Public Class NorthwindCacheClientSyncProvider
    
        Private Sub NorthwindCacheClientSyncProvider_ApplyChangeFailed( _
            ByVal sender As Object, ByVal e As  _
            Microsoft.Synchronization.Data.ApplyChangeFailedEventArgs) _
            Handles Me.ApplyChangeFailed
    
            If e.Conflict.ConflictType = _
                Microsoft.Synchronization.Data.ConflictType.ClientUpdateServerUpdate Then
    
                ' Resolve a client update / server update conflict by keeping the 
                ' client change.
                e.Action = Microsoft.Synchronization.Data.ApplyAction.Continue
    
            End If
    
        End Sub
    
    End Class
    

Per sincronizzare e visualizzare la risoluzione dei conflitti

  1. Premere F5.

  2. Nel form, aggiornare un record, quindi scegliere il pulsante Salva.

  3. In Esplora server/Esplora database, aggiornare lo stesso record aggiornato nel form, ma impostarlo su un valore diverso, quindi eseguire il commit della modifica.

  4. Tornare al form e scegliere Sincronizza.

  5. Verificare l'aggiornamento nella griglia dell'applicazione e nel database del server. Notare che l'aggiornamento effettuato nel client ha sovrascritto l'aggiornamento nel server.

Rimozione delle colonne di rilevamento del server dai comandi di sincronizzazione

Quando viene creata la Cache database locale, le colonne utilizzate per rilevare le modifiche nel database del server vengono scaricate nel client (in questa procedura dettagliata, le colonne sono CreationDate e LastEditDate). Per supportare la sincronizzazione bidirezionale e garantire la convergenza dei dati nel client e nel server, rimuovere queste colonne dai comandi SQL che consentono di applicare le modifiche al database del server. Queste colonne possono essere rimosse anche dai comandi che consentono di selezionare le modifiche del server da applicare al client, anche se non si tratta di un'operazione obbligatoria. A causa delle restrizioni su alcune modifiche dello schema nel database del client, le colonne non possono essere eliminate. Per ulteriori informazioni sui comandi di sincronizzazione, vedere Procedura: specificare snapshot, download, caricamenti e sincronizzazioni bidirezionali.

Nota

Se si utilizza il rilevamento delle modifiche di SQL Server 2008, le colonne di rilevamento non vengono aggiunte alle tabelle. In questo caso, non è necessario modificare i comandi che consentono di applicare le modifiche al server.

Il codice seguente consente di ridefinire due comandi impostati come proprietà sull'oggetto SyncAdapter per la tabella Customers: le proprietà InsertCommand() e UpdateCommand(). Nei comandi generati dalla finestra di dialogo Configura sincronizzazione dati erano contenuti riferimenti alle colonne CreationDate e LastEditDate. Nel codice seguente, questi comandi vengono ridefiniti nel metodo OnInitialized della classe CustomersSyncAdapter. La proprietà DeleteCommand() non viene ridefinita poiché non influisce sulla colonna CreationDate o LastEditDate.

Le variabili di ogni comando SQL vengono utilizzate per passare i dati e i metadati tra i Servizi di sincronizzazione, il client e il server. Le seguenti variabili di sessione vengono utilizzate nei comandi riportati di seguito:

  • @sync\_row\_count: restituisce il numero di righe interessate dall'ultima operazione sul server. Nei database di SQL Server, in @@rowcount viene fornito il valore per questa variabile.

  • @sync\_force\_write: utilizzato per imporre l'applicazione di una modifica non riuscita a causa di un conflitto o di un errore.

  • @sync\_last\_received\_anchor: utilizzato per definire il set di modifiche da sincronizzare durante una sessione.

Per ulteriori informazioni sulle variabili di sessione, vedere Procedura: utilizzare le variabili di sessione.

Per rimuovere le colonne di rilevamento dai comandi di sincronizzazione

  • Aggiungere il codice seguente alla classe NorthwindCache (NorthwindCache.vb o NorthwindCache.cs) dopo l'istruzione End Class per la classe NorthwindCacheServerSyncProvider.

    public partial class CustomersSyncAdapter
    {
    
        partial void OnInitialized()
        {
    
        // Redefine the insert command so that it does not insert values 
        // into the CreationDate and LastEditDate columns.
        System.Data.SqlClient.SqlCommand insertCommand = new 
            System.Data.SqlClient.SqlCommand();
    
        insertCommand.CommandText = "INSERT INTO dbo.Customers ([CustomerID], [CompanyName], " +
            "[ContactName], [ContactTitle], [Address], [City], [Region], [PostalCode], " +
            "[Country], [Phone], [Fax] )" +
            "VALUES (@CustomerID, @CompanyName, @ContactName, @ContactTitle, @Address, @City, " +
            "@Region, @PostalCode, @Country, @Phone, @Fax) SET @sync_row_count = @@rowcount";
        insertCommand.CommandType = System.Data.CommandType.Text;
        insertCommand.Parameters.Add("@CustomerID", System.Data.SqlDbType.NChar);
        insertCommand.Parameters.Add("@CompanyName", System.Data.SqlDbType.NVarChar);
        insertCommand.Parameters.Add("@ContactName", System.Data.SqlDbType.NVarChar);
        insertCommand.Parameters.Add("@ContactTitle", System.Data.SqlDbType.NVarChar);
        insertCommand.Parameters.Add("@Address", System.Data.SqlDbType.NVarChar);
        insertCommand.Parameters.Add("@City", System.Data.SqlDbType.NVarChar);
        insertCommand.Parameters.Add("@Region", System.Data.SqlDbType.NVarChar);
        insertCommand.Parameters.Add("@PostalCode", System.Data.SqlDbType.NVarChar);
        insertCommand.Parameters.Add("@Country", System.Data.SqlDbType.NVarChar);
        insertCommand.Parameters.Add("@Phone", System.Data.SqlDbType.NVarChar);
        insertCommand.Parameters.Add("@Fax", System.Data.SqlDbType.NVarChar);
        insertCommand.Parameters.Add("@sync_row_count", System.Data.SqlDbType.Int);
        insertCommand.Parameters["@sync_row_count"].Direction = 
            System.Data.ParameterDirection.Output;
    
        this.InsertCommand = insertCommand;
    
    
        // Redefine the update command so that it does not update values 
        // in the CreationDate and LastEditDate columns.
        System.Data.SqlClient.SqlCommand updateCommand = new System.Data.SqlClient.SqlCommand();
    
        updateCommand.CommandText = "UPDATE dbo.Customers SET [CompanyName] = @CompanyName, [ContactName] " +
            "= @ContactName, [ContactTitle] = @ContactTitle, [Address] = @Address, [City] " +
            "= @City, [Region] = @Region, [PostalCode] = @PostalCode, [Country] = @Country, " +
            "[Phone] = @Phone, [Fax] = @Fax " +
            "WHERE ([CustomerID] = @CustomerID) AND (@sync_force_write = 1 " +
            "OR ([LastEditDate] <= @sync_last_received_anchor)) SET @sync_row_count = @@rowcount";
        updateCommand.CommandType = System.Data.CommandType.Text;
        updateCommand.Parameters.Add("@CompanyName", System.Data.SqlDbType.NVarChar);
        updateCommand.Parameters.Add("@ContactName", System.Data.SqlDbType.NVarChar);
        updateCommand.Parameters.Add("@ContactTitle", System.Data.SqlDbType.NVarChar);
        updateCommand.Parameters.Add("@Address", System.Data.SqlDbType.NVarChar);
        updateCommand.Parameters.Add("@City", System.Data.SqlDbType.NVarChar);
        updateCommand.Parameters.Add("@Region", System.Data.SqlDbType.NVarChar);
        updateCommand.Parameters.Add("@PostalCode", System.Data.SqlDbType.NVarChar);
        updateCommand.Parameters.Add("@Country", System.Data.SqlDbType.NVarChar);
        updateCommand.Parameters.Add("@Phone", System.Data.SqlDbType.NVarChar);
        updateCommand.Parameters.Add("@Fax", System.Data.SqlDbType.NVarChar);
        updateCommand.Parameters.Add("@CustomerID", System.Data.SqlDbType.NChar);
        updateCommand.Parameters.Add("@sync_force_write", System.Data.SqlDbType.Bit);
        updateCommand.Parameters.Add("@sync_last_received_anchor", System.Data.SqlDbType.DateTime);
        updateCommand.Parameters.Add("@sync_row_count", System.Data.SqlDbType.Int);
        updateCommand.Parameters["@sync_row_count"].Direction = 
            System.Data.ParameterDirection.Output;
    
        this.UpdateCommand = updateCommand;
    
        }
    }
    
    Partial Public Class CustomersSyncAdapter
        Private Sub OnInitialized()
    
            ' Redefine the insert command so that it does not insert values 
            ' into the CreationDate and LastEditDate columns.
            Dim insertCommand As New System.Data.SqlClient.SqlCommand
            With insertCommand
                .CommandText = "INSERT INTO dbo.Customers ([CustomerID], [CompanyName], " & _
                    "[ContactName], [ContactTitle], [Address], [City], [Region], [PostalCode], " & _
                    "[Country], [Phone], [Fax] )" & _
                    "VALUES (@CustomerID, @CompanyName, @ContactName, @ContactTitle, @Address, @City, " & _
                    "@Region, @PostalCode, @Country, @Phone, @Fax) SET @sync_row_count = @@rowcount"
                .CommandType = System.Data.CommandType.Text
                .Parameters.Add("@CustomerID", System.Data.SqlDbType.NChar)
                .Parameters.Add("@CompanyName", System.Data.SqlDbType.NVarChar)
                .Parameters.Add("@ContactName", System.Data.SqlDbType.NVarChar)
                .Parameters.Add("@ContactTitle", System.Data.SqlDbType.NVarChar)
                .Parameters.Add("@Address", System.Data.SqlDbType.NVarChar)
                .Parameters.Add("@City", System.Data.SqlDbType.NVarChar)
                .Parameters.Add("@Region", System.Data.SqlDbType.NVarChar)
                .Parameters.Add("@PostalCode", System.Data.SqlDbType.NVarChar)
                .Parameters.Add("@Country", System.Data.SqlDbType.NVarChar)
                .Parameters.Add("@Phone", System.Data.SqlDbType.NVarChar)
                .Parameters.Add("@Fax", System.Data.SqlDbType.NVarChar)
                .Parameters.Add("@sync_row_count", System.Data.SqlDbType.Int)
                .Parameters("@sync_row_count").Direction = ParameterDirection.Output
            End With
    
            Me.InsertCommand = insertCommand
    
    
            ' Redefine the update command so that it does not update values 
            ' in the CreationDate and LastEditDate columns.
            Dim updateCommand As New System.Data.SqlClient.SqlCommand
            With updateCommand
                .CommandText = "UPDATE dbo.Customers SET [CompanyName] = @CompanyName, [ContactName] " & _
                    "= @ContactName, [ContactTitle] = @ContactTitle, [Address] = @Address, [City] " & _
                    "= @City, [Region] = @Region, [PostalCode] = @PostalCode, [Country] = @Country, " & _
                    "[Phone] = @Phone, [Fax] = @Fax " & _
                    "WHERE ([CustomerID] = @CustomerID) AND (@sync_force_write = 1 " & _
                    "OR ([LastEditDate] <= @sync_last_received_anchor)) SET @sync_row_count = @@rowcount"
                .CommandType = System.Data.CommandType.Text
                .Parameters.Add("@CompanyName", System.Data.SqlDbType.NVarChar)
                .Parameters.Add("@ContactName", System.Data.SqlDbType.NVarChar)
                .Parameters.Add("@ContactTitle", System.Data.SqlDbType.NVarChar)
                .Parameters.Add("@Address", System.Data.SqlDbType.NVarChar)
                .Parameters.Add("@City", System.Data.SqlDbType.NVarChar)
                .Parameters.Add("@Region", System.Data.SqlDbType.NVarChar)
                .Parameters.Add("@PostalCode", System.Data.SqlDbType.NVarChar)
                .Parameters.Add("@Country", System.Data.SqlDbType.NVarChar)
                .Parameters.Add("@Phone", System.Data.SqlDbType.NVarChar)
                .Parameters.Add("@Fax", System.Data.SqlDbType.NVarChar)
                .Parameters.Add("@CustomerID", System.Data.SqlDbType.NChar)
                .Parameters.Add("@sync_force_write", System.Data.SqlDbType.Bit)
                .Parameters.Add("@sync_last_received_anchor", System.Data.SqlDbType.DateTime)
                .Parameters.Add("@sync_row_count", System.Data.SqlDbType.Int)
                .Parameters("@sync_row_count").Direction = ParameterDirection.Output
            End With
    
            Me.UpdateCommand = updateCommand
    
        End Sub
    
    End Class
    

Verifica dell'applicazione

Per sincronizzare e visualizzare un aggiornamento della colonna di rilevamento

  1. Premere F5.

  2. Nel form, aggiornare un record modificando un valore nella colonna LastEditDate, quindi scegliere il pulsante Salva.

  3. Tornare al form e fare clic su Sincronizza.

  4. Verificare l'aggiornamento nella griglia dell'applicazione e nel database del server. Notare che il valore della colonna del server ha sovrascritto l'aggiornamento nel client. La procedura di aggiornamento è la seguente:

    1. I Servizi di sincronizzazione consentono di determinare che una riga è stata modificata nel client.

    2. Durante la sincronizzazione, la riga viene caricata e applicata alla tabella nel database del server. Le colonne di rilevamento non sono tuttavia incluse nell'istruzione di aggiornamento. Servizi di sincronizzazione esegue un efficace "aggiornamento fittizio" della tabella.

    3. La riga viene ora restituita al client, ma nei comandi che consentono di selezionare le modifiche dal server non sono incluse le colonne di rilevamento. Pertanto, la modifica effettuata nel client viene sovrascritta dal valore del server.

Passaggi successivi

In questa procedura dettagliata, è stata configurata la sincronizzazione bidirezionale con la gestione di base dei conflitti ed è stato esaminato il potenziale problema della presenza di colonne di rilevamento del server nel database del client. Utilizzando le classi parziali, è possibile estendere il codice della Cache database locale in altri modi significativi. Ad esempio, è possibile ridefinire i comandi SQL che consentono di selezionare le modifiche dal database del server in modo che i dati vengano filtrati quando vengono scaricati nel client. È consigliabile leggere le procedure di questa documentazione per capire i modi in cui è possibile aggiungere o modificare il codice di sincronizzazione per soddisfare le esigenze delle applicazioni. Per ulteriori informazioni, vedere Procedura: programmare attività comuni di sincronizzazione del client e del server.

Vedere anche

Concetti

Cenni preliminari sulle applicazioni connesse occasionalmente

Altre risorse

Procedura: programmare attività comuni di sincronizzazione del client e del server

Strumenti che consentono di sviluppare le applicazioni (servizi di sincronizzazione)