views:

301

answers:

1

Hello,

I have a desktop client that is using the sync framework to synchronise the database to the server. I am experiencing problems occasionally with it "Cleaning up" the tables change tracking.

I did some research and found a post on the internet that gave some code that resets the anchors on the table and then resynchronises. This is meant to cause the table to re-download, thus getting round the problem. (Source here)

I implemented the code like so:

=On Synchronisation:: =

catch (SyncException ex)
            {
                Exception ex2 = ex.InnerException;
                if (ex2.Message.Contains("cleaned up"))
                {
                    try
                    {
                        syncStats = syncAgent.Synchronize(true); 
                        //pass in true so removes anchors
                    catch (Exception anothererror)
                    {
                        //This will hit with another error equaling “Cleaned-up” on a table.
                    }
                }

= Sync Agent:: =

public SyncStatistics Synchronize(bool reinit)
        {
            if (!reinit)
                return base.Synchronize();
            try
            {
                ClientSyncProvider sqlCeProvider;
                sqlCeProvider = (ClientSyncProvider)this.LocalProvider;

                foreach (SyncTable st in this.Configuration.SyncTables)
                {
                    if (st.SyncDirection != SyncDirection.Snapshot)
                    {
                        // Null anchors here
                        sqlCeProvider.SetTableReceivedAnchor(st.TableName, new SyncAnchor());
                    }
                }
            }
            catch (Exception ex)
            {
            }
            return base.Synchronize();
        }

This code will detect the change tracking "cleaned up" error, then call Synchronize(true) and null all the anchors for each table, it then calls for another synchronization. This is the point it is meant to successfully synchronize, unfortunately this is not the case and will hit "catch (ex anothererror){" with another "cleaned up" exception.

Any ideas where i am going wrong?

Thanks, Kohan.

A: 

The problem could be with the adapter. Do you check @sync_initialized in your SQL-command?

If you don't distinguish between initialized and uninitialized synchronizations in your incremental commands you'll get this error since they'll always perform a check between @last_recieved_anchor and CHANGE_TRACKING_MIN_VALID_VERSION.

My incremental insert command follow this structure:

IF @sync_initialized = 0
BEGIN 
//SELECT without limitation by the changetable.
END 
ELSE
BEGIN
//SELECT limited by the changetable.
IF CHANGE_TRACKING_MIN_VALID_VERSION(object_id(N'[WorkOrder]')) > @sync_last_received_anchor RAISERROR (N'SQL Server Change Tracking has cleaned up tracking information for table ''%s''. To recover from this error, the client must reinitialize its local database and try again',16,3,N'[WorkORder]')
END
nj