<html> <head> <META http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Bi-Directional Replication</title> <link rel="stylesheet" type="text/css" href="../../../style.css"> </head> <body> <div class="CommonContent"> <div class="CommonContentArea"> <h1>Bi-Directional Replication</h1><script> //We attach this function to a browser object as a variable so that if multiple of these blocks are //present on the same page, then they will simply over-write eachother with the same function instead //of generating a naming collision. window.WikiCodeFormattingCopyToClipboard = function copyToClipboard(sID){ var sContent = document.getElementById(sID).innerText; if( window.clipboardData && clipboardData.setData ) { clipboardData.setData("Text", sContent); } else { alert("You must enable javascript access to your clipboard for this feature to work. Please referr to your browser documentation or Google search for instructions."); } } </script><p><br></p><p>The previous example copied all new or modified objects from the handheld device to the desktop database. What if we want to go the other way? Well, we only have to add one more loop:</p> <span name="cs_wiki_filter" csw_filters="cs"> <div class="FormattedSourceCode"><div class="fscHeader"><span class="fscFileName">ReplicationExample.cs: <span class="fscMemberName">replicateBiDirectional</span></span></div><div class="fscCode"><pre ID="....ReplicationCS.ZipsReplicationExample.Cs_ReplicationExample.Cs_ReplicateBiDirectional_265_82"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;">01</span><img src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/None.gif" align="top"/><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> ReplicateBiDirectional() </span><span style="color: #008080;">02</span><span style="color: #000000;"><img id="....ReplicationCS.ZipsReplicationExample.Cs_ReplicationExample.Cs_ReplicateBiDirectional_265_82_52_829_Open_Image" src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/ExpandedBlockStart.gif" align="top" onClick="this.style.display='none'; document.getElementById('....ReplicationCS.ZipsReplicationExample.Cs_ReplicationExample.Cs_ReplicateBiDirectional_265_82_52_829_Open_Text').style.display='none'; document.getElementById('....ReplicationCS.ZipsReplicationExample.Cs_ReplicationExample.Cs_ReplicateBiDirectional_265_82_52_829_Closed_Image').style.display='inline'; document.getElementById('....ReplicationCS.ZipsReplicationExample.Cs_ReplicationExample.Cs_ReplicateBiDirectional_265_82_52_829_Closed_Text').style.display='inline';"/><img id="....ReplicationCS.ZipsReplicationExample.Cs_ReplicationExample.Cs_ReplicateBiDirectional_265_82_52_829_Closed_Image" src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/ContractedBlock.gif" align="top" style="display: none;" onClick="this.style.display='none'; document.getElementById('....ReplicationCS.ZipsReplicationExample.Cs_ReplicationExample.Cs_ReplicateBiDirectional_265_82_52_829_Closed_Text').style.display='none'; document.getElementById('....ReplicationCS.ZipsReplicationExample.Cs_ReplicationExample.Cs_ReplicateBiDirectional_265_82_52_829_Open_Image').style.display='inline'; document.getElementById('....ReplicationCS.ZipsReplicationExample.Cs_ReplicationExample.Cs_ReplicateBiDirectional_265_82_52_829_Open_Text').style.display='inline';"/> </span><span id="....ReplicationCS.ZipsReplicationExample.Cs_ReplicationExample.Cs_ReplicateBiDirectional_265_82_52_829_Closed_Text" style="border: solid 1px #808080; background-color: #FFFFFF; display: none;">...</span><span id="....ReplicationCS.ZipsReplicationExample.Cs_ReplicationExample.Cs_ReplicateBiDirectional_265_82_52_829_Open_Text"><span style="color: #000000;">{ </span><span style="color: #008080;">03</span><span style="color: #000000;"><img src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/InBlock.gif" align="top"/> IObjectContainer desktop </span><span style="color: #000000;">=</span><span style="color: #000000;"> Db4oFactory.OpenFile(DtFileName); </span><span style="color: #008080;">04</span><span style="color: #000000;"><img src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/InBlock.gif" align="top"/> IObjectContainer handheld </span><span style="color: #000000;">=</span><span style="color: #000000;"> Db4oFactory.OpenFile(HhFileName); </span><span style="color: #008080;">05</span><span style="color: #000000;"><img src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/InBlock.gif" align="top"/> IReplicationSession replication </span><span style="color: #000000;">=</span><span style="color: #000000;"> Db4objects.Drs.Replication.Begin(handheld, desktop); </span><span style="color: #008080;">06</span><span style="color: #000000;"><img src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/InBlock.gif" align="top"/> IObjectSet changed </span><span style="color: #000000;">=</span><span style="color: #000000;"> replication.ProviderA().ObjectsChangedSinceLastReplication(); </span><span style="color: #008080;">07</span><span style="color: #000000;"><img src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/InBlock.gif" align="top"/> </span><span style="color: #0000FF;">while</span><span style="color: #000000;"> (changed.HasNext()) </span><span style="color: #008080;">08</span><span style="color: #000000;"><img id="....ReplicationCS.ZipsReplicationExample.Cs_ReplicationExample.Cs_ReplicateBiDirectional_265_82_445_515_Open_Image" src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" onClick="this.style.display='none'; document.getElementById('....ReplicationCS.ZipsReplicationExample.Cs_ReplicationExample.Cs_ReplicateBiDirectional_265_82_445_515_Open_Text').style.display='none'; document.getElementById('....ReplicationCS.ZipsReplicationExample.Cs_ReplicationExample.Cs_ReplicateBiDirectional_265_82_445_515_Closed_Image').style.display='inline'; document.getElementById('....ReplicationCS.ZipsReplicationExample.Cs_ReplicationExample.Cs_ReplicateBiDirectional_265_82_445_515_Closed_Text').style.display='inline';"/><img id="....ReplicationCS.ZipsReplicationExample.Cs_ReplicationExample.Cs_ReplicateBiDirectional_265_82_445_515_Closed_Image" src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/ContractedSubBlock.gif" align="top" style="display: none;" onClick="this.style.display='none'; document.getElementById('....ReplicationCS.ZipsReplicationExample.Cs_ReplicationExample.Cs_ReplicateBiDirectional_265_82_445_515_Closed_Text').style.display='none'; document.getElementById('....ReplicationCS.ZipsReplicationExample.Cs_ReplicationExample.Cs_ReplicateBiDirectional_265_82_445_515_Open_Image').style.display='inline'; document.getElementById('....ReplicationCS.ZipsReplicationExample.Cs_ReplicationExample.Cs_ReplicateBiDirectional_265_82_445_515_Open_Text').style.display='inline';"/> </span><span id="....ReplicationCS.ZipsReplicationExample.Cs_ReplicationExample.Cs_ReplicateBiDirectional_265_82_445_515_Closed_Text" style="border: solid 1px #808080; background-color: #FFFFFF; display: none;">...</span><span id="....ReplicationCS.ZipsReplicationExample.Cs_ReplicationExample.Cs_ReplicateBiDirectional_265_82_445_515_Open_Text"><span style="color: #000000;">{ </span><span style="color: #008080;">09</span><span style="color: #000000;"><img src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/InBlock.gif" align="top"/> replication.Replicate(changed.Next()); </span><span style="color: #008080;">10</span><span style="color: #000000;"><img src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"/> }</span></span><span style="color: #000000;"> </span><span style="color: #008080;">11</span><span style="color: #000000;"><img src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/InBlock.gif" align="top"/> </span><span style="color: #008080;">12</span><span style="color: #000000;"><img src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/InBlock.gif" align="top"/> </span><span style="color: #008000;">//</span><span style="color: #008000;"> Add one more loop for bi-directional replication</span><span style="color: #008000;"> </span><span style="color: #008080;">13</span><span style="color: #008000;"><img src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/InBlock.gif" align="top"/></span><span style="color: #000000;"> changed </span><span style="color: #000000;">=</span><span style="color: #000000;"> replication.ProviderB().ObjectsChangedSinceLastReplication(); </span><span style="color: #008080;">14</span><span style="color: #000000;"><img src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/InBlock.gif" align="top"/> </span><span style="color: #0000FF;">while</span><span style="color: #000000;"> (changed.HasNext()) </span><span style="color: #008080;">15</span><span style="color: #000000;"><img id="....ReplicationCS.ZipsReplicationExample.Cs_ReplicationExample.Cs_ReplicateBiDirectional_265_82_715_785_Open_Image" src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" onClick="this.style.display='none'; document.getElementById('....ReplicationCS.ZipsReplicationExample.Cs_ReplicationExample.Cs_ReplicateBiDirectional_265_82_715_785_Open_Text').style.display='none'; document.getElementById('....ReplicationCS.ZipsReplicationExample.Cs_ReplicationExample.Cs_ReplicateBiDirectional_265_82_715_785_Closed_Image').style.display='inline'; document.getElementById('....ReplicationCS.ZipsReplicationExample.Cs_ReplicationExample.Cs_ReplicateBiDirectional_265_82_715_785_Closed_Text').style.display='inline';"/><img id="....ReplicationCS.ZipsReplicationExample.Cs_ReplicationExample.Cs_ReplicateBiDirectional_265_82_715_785_Closed_Image" src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/ContractedSubBlock.gif" align="top" style="display: none;" onClick="this.style.display='none'; document.getElementById('....ReplicationCS.ZipsReplicationExample.Cs_ReplicationExample.Cs_ReplicateBiDirectional_265_82_715_785_Closed_Text').style.display='none'; document.getElementById('....ReplicationCS.ZipsReplicationExample.Cs_ReplicationExample.Cs_ReplicateBiDirectional_265_82_715_785_Open_Image').style.display='inline'; document.getElementById('....ReplicationCS.ZipsReplicationExample.Cs_ReplicationExample.Cs_ReplicateBiDirectional_265_82_715_785_Open_Text').style.display='inline';"/> </span><span id="....ReplicationCS.ZipsReplicationExample.Cs_ReplicationExample.Cs_ReplicateBiDirectional_265_82_715_785_Closed_Text" style="border: solid 1px #808080; background-color: #FFFFFF; display: none;">...</span><span id="....ReplicationCS.ZipsReplicationExample.Cs_ReplicationExample.Cs_ReplicateBiDirectional_265_82_715_785_Open_Text"><span style="color: #000000;">{ </span><span style="color: #008080;">16</span><span style="color: #000000;"><img src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/InBlock.gif" align="top"/> replication.Replicate(changed.Next()); </span><span style="color: #008080;">17</span><span style="color: #000000;"><img src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"/> }</span></span><span style="color: #000000;"> </span><span style="color: #008080;">18</span><span style="color: #000000;"><img src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/InBlock.gif" align="top"/> replication.Commit(); </span><span style="color: #008080;">19</span><span style="color: #000000;"><img src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/ExpandedBlockEnd.gif" align="top"/> }</span></span></div></pre></div></div> </span> <span name="cs_wiki_filter" csw_filters="vb"> <div class="FormattedSourceCode"><div class="fscHeader"><span class="fscFileName">ReplicationExample.vb: <span class="fscMemberName">replicateBiDirectional</span></span></div><div class="fscCode"><pre ID="....ReplicationVB.ZipsReplicationExample.Vb_ReplicationExample.Vb_ReplicateBiDirectional_411_82"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;">01</span><img id="....ReplicationVB.ZipsReplicationExample.Vb_ReplicationExample.Vb_ReplicateBiDirectional_411_82_14_837_Open_Image" src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/ExpandedBlockStart.gif" align="top" onClick="this.style.display='none'; document.getElementById('....ReplicationVB.ZipsReplicationExample.Vb_ReplicationExample.Vb_ReplicateBiDirectional_411_82_14_837_Open_Text').style.display='none'; document.getElementById('....ReplicationVB.ZipsReplicationExample.Vb_ReplicationExample.Vb_ReplicateBiDirectional_411_82_14_837_Closed_Image').style.display='inline'; document.getElementById('....ReplicationVB.ZipsReplicationExample.Vb_ReplicationExample.Vb_ReplicateBiDirectional_411_82_14_837_Closed_Text').style.display='inline';"/><img id="....ReplicationVB.ZipsReplicationExample.Vb_ReplicationExample.Vb_ReplicateBiDirectional_411_82_14_837_Closed_Image" src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/ContractedBlock.gif" align="top" style="display: none;" onClick="this.style.display='none'; document.getElementById('....ReplicationVB.ZipsReplicationExample.Vb_ReplicationExample.Vb_ReplicateBiDirectional_411_82_14_837_Closed_Text').style.display='none'; document.getElementById('....ReplicationVB.ZipsReplicationExample.Vb_ReplicationExample.Vb_ReplicateBiDirectional_411_82_14_837_Open_Image').style.display='inline'; document.getElementById('....ReplicationVB.ZipsReplicationExample.Vb_ReplicationExample.Vb_ReplicateBiDirectional_411_82_14_837_Open_Text').style.display='inline';"/><span style="color: #0000FF;">Public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">Shared</span><span style="color: #000000;"> </span><span id="....ReplicationVB.ZipsReplicationExample.Vb_ReplicationExample.Vb_ReplicateBiDirectional_411_82_14_837_Closed_Text" style="border: solid 1px #808080; background-color: #FFFFFF; display: none;">Sub ReplicateBiDirectional()</span><span id="....ReplicationVB.ZipsReplicationExample.Vb_ReplicationExample.Vb_ReplicateBiDirectional_411_82_14_837_Open_Text"><span style="color: #0000FF;">Sub</span><span style="color: #000000;"> ReplicateBiDirectional() </span><span style="color: #008080;">02</span><span style="color: #000000;"><img src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/InBlock.gif" align="top"/> </span><span style="color: #0000FF;">Dim</span><span style="color: #000000;"> desktop </span><span style="color: #0000FF;">As</span><span style="color: #000000;"> IObjectContainer </span><span style="color: #000000;">=</span><span style="color: #000000;"> Db4oFactory.OpenFile(DtFileName) </span><span style="color: #008080;">03</span><span style="color: #000000;"><img src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/InBlock.gif" align="top"/> </span><span style="color: #0000FF;">Dim</span><span style="color: #000000;"> handheld </span><span style="color: #0000FF;">As</span><span style="color: #000000;"> IObjectContainer </span><span style="color: #000000;">=</span><span style="color: #000000;"> Db4oFactory.OpenFile(HhFileName) </span><span style="color: #008080;">04</span><span style="color: #000000;"><img src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/InBlock.gif" align="top"/> </span><span style="color: #0000FF;">Dim</span><span style="color: #000000;"> replic </span><span style="color: #0000FF;">As</span><span style="color: #000000;"> IReplicationSession </span><span style="color: #000000;">=</span><span style="color: #000000;"> Replication.Begin(handheld, desktop) </span><span style="color: #008000;">' </span><span style="color: #008080;">05</span><span style="color: #008000;"><img src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/InBlock.gif" align="top"/></span><span style="color: #000000;"> </span><span style="color: #0000FF;">Dim</span><span style="color: #000000;"> changed </span><span style="color: #0000FF;">As</span><span style="color: #000000;"> IObjectSet </span><span style="color: #000000;">=</span><span style="color: #000000;"> replic.ProviderA().ObjectsChangedSinceLastReplication() </span><span style="color: #008080;">06</span><span style="color: #000000;"><img src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/InBlock.gif" align="top"/> </span><span style="color: #008000;">'</span><span style="color: #008000;">Iterate changed objects, replicate them</span><span style="color: #008000;"> </span><span style="color: #008080;">07</span><span style="color: #008000;"><img src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/InBlock.gif" align="top"/></span><span style="color: #000000;"> </span><span style="color: #0000FF;">While</span><span style="color: #000000;"> changed.HasNext() </span><span style="color: #008080;">08</span><span style="color: #000000;"><img src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/InBlock.gif" align="top"/> replic.Replicate(changed.Next()) </span><span style="color: #008080;">09</span><span style="color: #000000;"><img src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/InBlock.gif" align="top"/> </span><span style="color: #0000FF;">End</span><span style="color: #000000;"> </span><span style="color: #0000FF;">While</span><span style="color: #000000;"> </span><span style="color: #008080;">10</span><span style="color: #000000;"><img src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/InBlock.gif" align="top"/> </span><span style="color: #008080;">11</span><span style="color: #000000;"><img src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/InBlock.gif" align="top"/> changed </span><span style="color: #000000;">=</span><span style="color: #000000;"> replic.ProviderB().ObjectsChangedSinceLastReplication() </span><span style="color: #008080;">12</span><span style="color: #000000;"><img src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/InBlock.gif" align="top"/> </span><span style="color: #008000;">'</span><span style="color: #008000;"> Add one more loop for bi-directional replication</span><span style="color: #008000;"> </span><span style="color: #008080;">13</span><span style="color: #008000;"><img src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/InBlock.gif" align="top"/></span><span style="color: #000000;"> </span><span style="color: #0000FF;">While</span><span style="color: #000000;"> changed.HasNext() </span><span style="color: #008080;">14</span><span style="color: #000000;"><img src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/InBlock.gif" align="top"/> replic.Replicate(changed.Next()) </span><span style="color: #008080;">15</span><span style="color: #000000;"><img src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/InBlock.gif" align="top"/> </span><span style="color: #0000FF;">End</span><span style="color: #000000;"> </span><span style="color: #0000FF;">While</span><span style="color: #000000;"> </span><span style="color: #008080;">16</span><span style="color: #000000;"><img src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/InBlock.gif" align="top"/> replic.Commit() </span><span style="color: #008080;">17</span><span style="color: #000000;"><img src="../../../Utility/ActiPro.CodeHighligher/OutliningIndicators/ExpandedBlockEnd.gif" align="top"/> </span><span style="color: #0000FF;">End Sub</span></span></div></pre></div></div> </span>Now our handheld contains all of the new and modified records from our desktop.<br><p> Easy, isn't it? Now, if there had been any modifications made to the destination database, the two are now both in sync with each other. </p> </div> </div> <div id="footer"> This revision (1) was last Modified 2007-07-08T21:23:26 by Tetyana. </div> </body> </html>