static void Main(string[] args) { //The Utility class handles all functionality that is not //directly related to synchronization, such as holding //connection string information and making changes to the //server and client databases. Utility util = new Utility(); //The SampleStats class handles information from the SyncStatistics //object that the Synchronize method returns. SampleStats sampleStats = new SampleStats(); //Request a password for the client database, and delete //and re-create the database. The client synchronization //provider also enables you to create the client database //if it does not exist. util.SetClientPassword(); util.RecreateClientDatabase(); //Specify which server and database to connect to. util.SetServerAndDb("localhost", "SyncSamplesDb_ChangeTracking"); //Initial synchronization. Instantiate the SyncAgent //and call Synchronize. SampleSyncAgent sampleSyncAgent = new SampleSyncAgent(); SyncStatistics syncStatistics = sampleSyncAgent.Synchronize(); sampleStats.DisplayStats(syncStatistics, "initial"); //Make changes on the server and client. util.MakeDataChangesOnServer("Customer"); util.MakeDataChangesOnClient("Customer"); //Subsequent synchronization. syncStatistics = sampleSyncAgent.Synchronize(); sampleStats.DisplayStats(syncStatistics, "subsequent"); //Make conflicting changes on the server and client. util.MakeConflictingChangesOnClientAndServer(); //Subsequent synchronization. syncStatistics = sampleSyncAgent.Synchronize(); sampleStats.DisplayStats(syncStatistics, "subsequent"); //Return server data back to its original state. util.CleanUpServer(); //Exit. Console.Write("\nPress Enter to close the window."); Console.ReadLine(); }
static void Main(string[] args) { //The Utility class handles all functionality that is not //directly related to synchronization, such as holding connection //string information and making changes to the server and client databases. Utility util = new Utility(); //The SampleStats class handles information from the SyncStatistics //object that the Synchronize method returns. SampleStats sampleStats = new SampleStats(); //Request a password for the client database, and delete //and re-create the database. The client synchronization //provider also enables you to create the client database //if it does not exist. util.SetClientPassword(); util.RecreateClientDatabase(); //Initial synchronization. Instantiate the SyncAgent //and call Synchronize. SampleSyncAgent sampleSyncAgent = new SampleSyncAgent(); SyncStatistics syncStatistics = sampleSyncAgent.Synchronize(); sampleStats.DisplayStats(syncStatistics, "initial"); //Make a change at the client that fails when it is //applied at the server. util.MakeFailingChangesOnClient(); //Make changes at the client and server that conflict //when they are synchronized. util.MakeConflictingChangesOnClientAndServer(); //Subsequent synchronization. syncStatistics = sampleSyncAgent.Synchronize(); sampleStats.DisplayStats(syncStatistics, "subsequent"); //Return server data back to its original state. //Comment out this line if you want to view the //state of the data after all conflicts are resolved. util.CleanUpServer(); //Exit. Console.Write("\nPress Enter to close the window."); Console.ReadLine(); }
static void Main(string[] args) { //The Utility class handles all functionality that is not //directly related to synchronization, such as holding connection //string information and making changes to the server and client databases. Utility util = new Utility(); //The SampleStats class handles information from the SyncStatistics //object that the Synchronize method returns. SampleStats sampleStats = new SampleStats(); //Request a password for the client database, and delete //and re-create the database. The client synchronization //provider also enables you to create the client database //if it does not exist. util.SetClientPassword(); util.RecreateClientDatabase(); //Create the Customer table on the client by using SQL. We add //a SalesNotes column that will not be synchronized. //When we create the Customer SyncTable, we specify that //Synchronization Services should use an existing table. util.CreateTableOnClient(); //Initial synchronization. Instantiate the SyncAgent //and call Synchronize. SampleSyncAgent sampleSyncAgent = new SampleSyncAgent(); SyncStatistics syncStatistics = sampleSyncAgent.Synchronize(); sampleStats.DisplayStats(syncStatistics, "initial"); //Make changes on the server and client. util.MakeDataChangesOnServer("Customer"); util.MakeDataChangesOnClient("Customer"); //Subsequent synchronization. syncStatistics = sampleSyncAgent.Synchronize(); sampleStats.DisplayStats(syncStatistics, "subsequent"); //Return the server data back to its original state. util.CleanUpServer(); //Exit. Console.Write("\nPress Enter to close the window."); Console.ReadLine(); }
static void Main(string[] args) { //The Utility class handles all functionality that is not //directly related to synchronization, such as holding connection //string information and making changes to the server database. Utility util = new Utility(); //The SampleStats class handles information from the SyncStatistics //object that the Synchronize method returns. SampleStats sampleStats = new SampleStats(); //Delete and re-create the database. The client synchronization //provider also enables you to create the client database //if it does not exist. util.SetClientPassword(); util.RecreateClientDatabase(); //Initial synchronization. Instantiate the SyncAgent //and call Synchronize. //<snippetOCS_CS_Basic_Synchronize> SampleSyncAgent sampleSyncAgent = new SampleSyncAgent(); SyncStatistics syncStatistics = sampleSyncAgent.Synchronize(); //</snippetOCS_CS_Basic_Synchronize> sampleStats.DisplayStats(syncStatistics, "initial"); //Make changes on the server. util.MakeDataChangesOnServer(); //Subsequent synchronization. syncStatistics = sampleSyncAgent.Synchronize(); sampleStats.DisplayStats(syncStatistics, "subsequent"); //Return server data back to its original state. util.CleanUpServer(); //Exit. Console.Write("\nPress Enter to close the window."); Console.ReadLine(); }
static void Main(string[] args) { //The Utility class handles all functionality that is not //directly related to synchronization, such as holding peerConnection //string information and making changes to the server database. Utility util = new Utility(); util.RecreateCePeerDatabase(util.Ce1ConnString); //<snippetOCSv2_CS_Peer_Cleanup_Synchronize> //The SampleStats class handles information from the SyncStatistics //object that the Synchronize method returns. SampleStats sampleStats = new SampleStats(); SampleSyncProvider sampleSyncProvider = new SampleSyncProvider(); try { //Initial synchronization. Instantiate the SyncOrchestrator //and call Synchronize. sampleSyncProvider = new SampleSyncProvider(); SyncOrchestrator sampleSyncAgent; SyncOperationStatistics syncStatistics; //The integer passed to ConfigureDbSyncProvider is how old that metadata //can be (in days) before it is deleted when CleanupMetadata() is called. //The integer value is only relevant if CleanupMetadata() is called, as //demonstrated later in this application. sampleSyncAgent = new SampleSyncAgent( sampleSyncProvider.ConfigureDbSyncProvider(util.Peer1ConnString, 7), sampleSyncProvider.ConfigureDbSyncProvider(util.Peer3ConnString, 7)); syncStatistics = sampleSyncAgent.Synchronize(); sampleStats.DisplayStats(syncStatistics, "initial"); sampleSyncAgent = new SampleSyncAgent( sampleSyncProvider.ConfigureDbSyncProvider(util.Peer3ConnString, 7), sampleSyncProvider.ConfigureCeSyncProvider(util.Ce1ConnString)); syncStatistics = sampleSyncAgent.Synchronize(); sampleStats.DisplayStats(syncStatistics, "initial"); } catch (DbOutdatedSyncException ex) { Console.WriteLine("Outdated Knowledge: " + ex.OutdatedPeerSyncKnowledge.ToString() + " Clean up knowledge: " + ex.MissingCleanupKnowledge.ToString()); } catch (Exception ex) { Console.WriteLine(ex.Message); } //</snippetOCSv2_CS_Peer_Cleanup_Synchronize> //Update a row on peer 1. util.MakeDataChangesOnPeer(util.Peer1ConnString, "Customer"); //Instantiate a provider, connect to peer 1, and delete tombstone metadata that //is older than 7 days. //<snippetOCSv2_CS_Peer_Cleanup_CleanupMetadata> sampleSyncProvider = new SampleSyncProvider(); DbSyncProvider provider1 = sampleSyncProvider.ConfigureDbSyncProvider(util.Peer1ConnString, 7); if (provider1.CleanupMetadata() == true) { Console.WriteLine(String.Empty); Console.WriteLine("Metadata cleanup ran in the SyncSamplesDb_Peer1 database."); Console.WriteLine("Metadata more than 7 days old was deleted."); } else { Console.WriteLine("Metadata cleanup failed, most likely due to concurrency issues."); } //</snippetOCSv2_CS_Peer_Cleanup_CleanupMetadata> //Synchronize. try { SyncOrchestrator sampleSyncAgent; SyncOperationStatistics syncStatistics; sampleSyncAgent = new SampleSyncAgent( sampleSyncProvider.ConfigureDbSyncProvider(util.Peer1ConnString, 7), sampleSyncProvider.ConfigureDbSyncProvider(util.Peer3ConnString, 7)); syncStatistics = sampleSyncAgent.Synchronize(); sampleStats.DisplayStats(syncStatistics, "subsequent"); } catch (DbOutdatedSyncException ex) { Console.WriteLine("Outdated Knowledge: " + ex.OutdatedPeerSyncKnowledge.ToString() + " Clean up knowledge: " + ex.MissingCleanupKnowledge.ToString()); } catch (Exception ex) { Console.WriteLine(ex.Message); } //Delete a row on peer 3. util.MakeDataChangesOnPeer(util.Peer3ConnString, "Customer"); //Instantiate a provider, connect to peer 3, and delete all tombstone metadata. sampleSyncProvider = new SampleSyncProvider(); DbSyncProvider provider3 = sampleSyncProvider.ConfigureDbSyncProvider(util.Peer3ConnString, -1); if (provider3.CleanupMetadata() == true) { Console.WriteLine(String.Empty); Console.WriteLine("Metadata cleanup ran in the SyncSamplesDb_Peer3 database."); Console.WriteLine("All metadata was deleted."); } else { Console.WriteLine("Metadata cleanup failed, most likely due to concurrency issues."); } //Synchronize. try { SyncOrchestrator sampleSyncAgent; SyncOperationStatistics syncStatistics; sampleSyncAgent = new SampleSyncAgent( sampleSyncProvider.ConfigureDbSyncProvider(util.Peer1ConnString, 7), sampleSyncProvider.ConfigureDbSyncProvider(util.Peer3ConnString, 7)); syncStatistics = sampleSyncAgent.Synchronize(); sampleStats.DisplayStats(syncStatistics, "subsequent"); } catch (DbOutdatedSyncException ex) { Console.WriteLine(String.Empty); Console.WriteLine("Synchronization failed due to outdated synchronization knowledge,"); Console.WriteLine("which is expected in this sample application."); Console.WriteLine("Drop and recreate the sample databases."); Console.WriteLine(String.Empty); Console.WriteLine("Outdated Knowledge: " + ex.OutdatedPeerSyncKnowledge.ToString() + " Clean up knowledge: " + ex.MissingCleanupKnowledge.ToString()); Console.WriteLine(String.Empty); } catch (Exception ex) { Console.WriteLine(ex.Message); } //Return peer data back to its original state. util.CleanUpPeer(util.Peer1ConnString); util.CleanUpPeer(util.Peer3ConnString); //Exit. Console.Write("\nPress Enter to close the window."); Console.ReadLine(); }
static void Main(string[] args) { //The Utility class handles all functionality that is not //directly related to synchronization, such as holding peerConnection //string information and making changes to the server database. Utility util = new Utility(); //<snippetOCSv2_CS_Basic_Peer_Synchronize> //The SampleStats class handles information from the SyncStatistics //object that the Synchronize method returns. SampleStats sampleStats = new SampleStats(); try { //Initial synchronization. Instantiate the SyncOrchestrator //and call Synchronize. Note that data is not synchronized during the //session between peer 1 and peer 3, because all rows have already //been delivered to peer 3 during its synchronization session with peer 2. SyncOrchestrator sampleSyncAgent; SyncOperationStatistics syncStatistics; sampleSyncAgent = new SampleSyncAgent(util.Peer1ConnString, util.Peer2ConnString); syncStatistics = sampleSyncAgent.Synchronize(); sampleStats.DisplayStats(syncStatistics, "initial"); sampleSyncAgent = new SampleSyncAgent(util.Peer2ConnString, util.Peer3ConnString); syncStatistics = sampleSyncAgent.Synchronize(); sampleStats.DisplayStats(syncStatistics, "initial"); sampleSyncAgent = new SampleSyncAgent(util.Peer1ConnString, util.Peer3ConnString); syncStatistics = sampleSyncAgent.Synchronize(); sampleStats.DisplayStats(syncStatistics, "initial"); } catch (DbOutdatedSyncException ex) { Console.WriteLine("Outdated Knowledge: " + ex.OutdatedPeerSyncKnowledge.ToString() + " Clean up knowledge: " + ex.MissingCleanupKnowledge.ToString()); } catch (Exception ex) { Console.WriteLine(ex.Message); } //</snippetOCSv2_CS_Basic_Peer_Synchronize> //Make changes in each peer database. util.MakeDataChangesOnPeer(util.Peer1ConnString, "Customer"); util.MakeDataChangesOnPeer(util.Peer2ConnString, "Customer"); util.MakeDataChangesOnPeer(util.Peer3ConnString, "Customer"); try { //Subsequent synchronization. Changes are now synchronized between all //peers. SyncOrchestrator sampleSyncAgent; SyncOperationStatistics syncStatistics; sampleSyncAgent = new SampleSyncAgent(util.Peer1ConnString, util.Peer2ConnString); syncStatistics = sampleSyncAgent.Synchronize(); sampleStats.DisplayStats(syncStatistics, "subsequent"); sampleSyncAgent = new SampleSyncAgent(util.Peer2ConnString, util.Peer3ConnString); syncStatistics = sampleSyncAgent.Synchronize(); sampleStats.DisplayStats(syncStatistics, "subsequent"); sampleSyncAgent = new SampleSyncAgent(util.Peer1ConnString, util.Peer3ConnString); syncStatistics = sampleSyncAgent.Synchronize(); sampleStats.DisplayStats(syncStatistics, "subsequent"); //Sessions in which no new changes have been made. //In this case, the call to SelectTableMaxTimestampsCommand indicates //that no data changes are available to synchronize, so //SelectIncrementalChangesCommand is not called. sampleSyncAgent = new SampleSyncAgent(util.Peer1ConnString, util.Peer2ConnString); syncStatistics = sampleSyncAgent.Synchronize(); sampleStats.DisplayStats(syncStatistics, "subsequent"); sampleSyncAgent = new SampleSyncAgent(util.Peer1ConnString, util.Peer2ConnString); syncStatistics = sampleSyncAgent.Synchronize(); sampleStats.DisplayStats(syncStatistics, "subsequent"); } catch (DbOutdatedSyncException ex) { Console.WriteLine("Outdated Knowledge: " + ex.OutdatedPeerSyncKnowledge.ToString() + " Clean up knowledge: " + ex.MissingCleanupKnowledge.ToString()); } catch (Exception ex) { Console.WriteLine(ex.Message); } //Return peer data back to its original state. util.CleanUpPeer(util.Peer1ConnString); util.CleanUpPeer(util.Peer2ConnString); util.CleanUpPeer(util.Peer3ConnString); //Exit. Console.Write("\nPress Enter to close the window."); Console.ReadLine(); }
static void Main(string[] args) { //The Utility class handles all functionality that is not //directly related to synchronization, such as holding peerConnection //string information and making changes to the server database. Utility util = new Utility(); util.RecreateCePeerDatabase(util.Ce1ConnString); util.RecreateCePeerDatabase(util.Ce2ConnString); //<snippetOCSv2_CS_Basic_PeerWithCe_Synchronize> //The SampleStats class handles information from the SyncStatistics //object that the Synchronize method returns. SampleStats sampleStats = new SampleStats(); try { //Initial synchronization. Instantiate the SyncOrchestrator //and call Synchronize. SampleSyncProvider sampleSyncProvider = new SampleSyncProvider(); SyncOrchestrator sampleSyncAgent; SyncOperationStatistics syncStatistics; //First session: Synchronize two databases by using two instances //of DbSyncProvider. sampleSyncAgent = new SampleSyncAgent( sampleSyncProvider.ConfigureDbSyncProvider(util.Peer1ConnString), sampleSyncProvider.ConfigureDbSyncProvider(util.Peer2ConnString)); syncStatistics = sampleSyncAgent.Synchronize(); sampleStats.DisplayStats(syncStatistics, "initial"); //<snippetOCSv2_CS_Basic_PeerWithCe_SnapshotInit> //Second session: Synchronize two databases by using one instance of //DbSyncProvider and one instance of SqlCeSyncProvider. After the Compact //database is initialized, it is copied by using GenerateSnapshot and then //used for the third session. SqlCeSyncProvider sqlCeSyncProvider1 = sampleSyncProvider.ConfigureCeSyncProvider(util.Ce1ConnString); sampleSyncAgent = new SampleSyncAgent( sampleSyncProvider.ConfigureDbSyncProvider(util.Peer1ConnString), sqlCeSyncProvider1); syncStatistics = sampleSyncAgent.Synchronize(); sampleStats.DisplayStats(syncStatistics, "initial"); //Copy the Compact database and save it as SyncSampleCe2.sdf. SqlCeSyncStoreSnapshotInitialization snapshotInit = new SqlCeSyncStoreSnapshotInitialization(); snapshotInit.GenerateSnapshot(new SqlCeConnection(util.Ce1ConnString), "SyncSampleCe2.sdf"); //Make a change that is synchronized during the third session. util.MakeDataChangesOnPeer(util.Peer1ConnString, "Customer"); //Third session: Synchronize the new Compact database. The five rows //from SyncSampleCe1.sdf are already in SyncSampleCe2.sdf. The new //change is now downloaded to bring SyncSampleCe2.sdf up to date. //SyncSampleCe2.sdf will get this row during the next round of //synchronization sessions. sampleSyncAgent = new SampleSyncAgent( sampleSyncProvider.ConfigureDbSyncProvider(util.Peer1ConnString), sampleSyncProvider.ConfigureCeSyncProvider(util.Ce2ConnString)); syncStatistics = sampleSyncAgent.Synchronize(); sampleStats.DisplayStats(syncStatistics, "initial"); //</snippetOCSv2_CS_Basic_PeerWithCe_SnapshotInit> } catch (DbOutdatedSyncException ex) { Console.WriteLine("Outdated Knowledge: " + ex.OutdatedPeerSyncKnowledge.ToString() + " Clean up knowledge: " + ex.MissingCleanupKnowledge.ToString()); } catch (Exception ex) { Console.WriteLine(ex.Message); } //</snippetOCSv2_CS_Basic_PeerWithCe_Synchronize> //Make a change in one of the databases. util.MakeDataChangesOnPeer(util.Peer2ConnString, "Customer"); try { //Subsequent synchronization. Changes are now synchronized between all //nodes. SampleSyncProvider sampleSyncProvider = new SampleSyncProvider(); SyncOrchestrator sampleSyncAgent; SyncOperationStatistics syncStatistics; sampleSyncAgent = new SampleSyncAgent( sampleSyncProvider.ConfigureDbSyncProvider(util.Peer1ConnString), sampleSyncProvider.ConfigureDbSyncProvider(util.Peer2ConnString)); syncStatistics = sampleSyncAgent.Synchronize(); sampleStats.DisplayStats(syncStatistics, "subsequent"); sampleSyncAgent = new SampleSyncAgent( sampleSyncProvider.ConfigureDbSyncProvider(util.Peer1ConnString), sampleSyncProvider.ConfigureCeSyncProvider(util.Ce1ConnString)); syncStatistics = sampleSyncAgent.Synchronize(); sampleStats.DisplayStats(syncStatistics, "subsequent"); sampleSyncAgent = new SampleSyncAgent( sampleSyncProvider.ConfigureDbSyncProvider(util.Peer1ConnString), sampleSyncProvider.ConfigureCeSyncProvider(util.Ce2ConnString)); syncStatistics = sampleSyncAgent.Synchronize(); sampleStats.DisplayStats(syncStatistics, "subsequent"); } catch (DbOutdatedSyncException ex) { Console.WriteLine("Outdated Knowledge: " + ex.OutdatedPeerSyncKnowledge.ToString() + " Clean up knowledge: " + ex.MissingCleanupKnowledge.ToString()); } catch (Exception ex) { Console.WriteLine(ex.Message); } //Return data back to its original state. util.CleanUpPeer(util.Peer1ConnString); util.CleanUpPeer(util.Peer2ConnString); //Exit. Console.Write("\nPress Enter to close the window."); Console.ReadLine(); }
static void Main(string[] args) { //The Utility class handles all functionality that is not //directly related to synchronization, such as holding connection //string information and making changes to the server database. Utility util = new Utility(); //The SampleStats class handles information from the SyncStatistics //object that the Synchronize method returns. SampleStats sampleStats = new SampleStats(); //Delete and re-create the database. The client synchronization //provider also enables you to create the client database //if it does not exist. util.SetClientPassword(); util.RecreateClientDatabase(); //Write to the console which tracing levels are enabled. The app.config //file specifies a value of 3 for the SyncTracer switch, which corresponds //to Info. Therefore, Error, Warning, and Info return True, and Verbose //returns False. Console.WriteLine(""); //<snippetOCS_CS_Tracing_LevelsEnabled> Console.WriteLine("** Tracing Levels Enabled for this Application **"); Console.WriteLine("Error: " + SyncTracer.IsErrorEnabled().ToString()); Console.WriteLine("Warning: " + SyncTracer.IsWarningEnabled().ToString()); Console.WriteLine("Info: " + SyncTracer.IsInfoEnabled().ToString()); Console.WriteLine("Verbose: " + SyncTracer.IsVerboseEnabled().ToString()); //</snippetOCS_CS_Tracing_LevelsEnabled> //Initial synchronization. Instantiate the SyncAgent //and call Synchronize. //<snippetOCS_CS_Tracing_Synchronize> SampleSyncAgent sampleSyncAgent = new SampleSyncAgent(); SyncStatistics syncStatistics = sampleSyncAgent.Synchronize(); //</snippetOCS_CS_Tracing_Synchronize> sampleStats.DisplayStats(syncStatistics, "initial"); //Make a change at the client that fails when it is //applied at the server. The constraint violation //is automatically written to the trace file as a warning. util.MakeFailingChangesOnClient(); //Make changes at the client and server that conflict //when they are synchronized. The conflicts are written //to the trace file in the SampleServerSyncProvider_ApplyChangeFailed //event handler. util.MakeConflictingChangesOnClientAndServer(); //Subsequent synchronization. syncStatistics = sampleSyncAgent.Synchronize(); sampleStats.DisplayStats(syncStatistics, "subsequent"); //Return server data back to its original state. util.CleanUpServer(); //Exit. Console.Write("\nPress Enter to close the window."); Console.ReadLine(); }