<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.charteris.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Charteris Community Server</title><link>http://blogs.charteris.com/blogs/</link><description>Welcome to the &lt;A href="http://charteris.com"&gt;Charteris plc&lt;/A&gt; Community</description><dc:language>en-US</dc:language><generator>CommunityServer 2007 SP2 (Build: 20611.960)</generator><item><title>Sync Framework 2.0 Series – Part 3 – Performing Collaborative Synchronisation</title><link>http://blogs.charteris.com/blogs/ivorb/archive/2010/08/13/sync-framework-2-0-series-part-3-performing-collaborative-synchronisation.aspx</link><pubDate>Fri, 13 Aug 2010 08:59:43 GMT</pubDate><guid isPermaLink="false">0cdfd867-77e4-483c-9e74-84c93cc8eba0:1458</guid><dc:creator>IvorB</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;This is part 3 in the Sync Framework 2.0 series and deals with building an application that can perform collaborative synchronisation. By this – I mean we have an application which will directly update 1 instance of SQL Server, but this server is kept in sync with a number of other SQL Server peers. In order to keep things relatively simple – we will assume only SQL Servers, so the basic idea is to build something like the following:&lt;/p&gt;  &lt;div style="padding-bottom:0px;padding-left:0px;width:580px;padding-right:0px;display:block;float:none;margin-left:auto;margin-right:auto;padding-top:0px;" id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:31273b13-c853-43fb-85ba-ee45745a0d3b" class="wlWriterEditableSmartContent"&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/CollaborativeSynchronisation8x6_3465F072.jpg" title="Collaborative Synchronisation" rel="thumbnail"&gt;&lt;img border="0" src="http://blogs.charteris.com/blogs/ivorb/CollaborativeSynchronisation_7FE51E29.png" width="580" height="343" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;I decided to use the pubs database and in particular the table “Authors”, so you’ll need 2 different databases with this table - I called mine pubs and pubsCopy. I’m going to assume that the tables are in sync when we start, so we only need to worry about keeping them in sync.&lt;/p&gt;  &lt;p&gt;In general with SQL Server and Sync Framework, there are 2 approaches to keeping tables in sync:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;SQL Server Change Tracking &lt;/li&gt;    &lt;li&gt;Adding custom tables/columns/trigger to track changes. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;As SQL Server change tracking limits you to specific versions of SQL Server, and as our previous example used change tracking – this example is going custom tables/columns and triggers to track changes. The first thing we need to do is provision both tables which basically means creating the tables/columns &amp;amp; triggers to track the database changes in both databases. I created a helper class to wrap this functionality as it looks like the following:&lt;/p&gt;  &lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// Wraps some synchronisation functionality&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; SynchronisationHelper&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; scopeName = &lt;span style="color:#006080;"&gt;&amp;quot;authors&amp;quot;&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;/// Provision a sql server&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;connectionString&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum13"&gt;  13:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; ProvisionSqlSyncProvider(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; connectionString)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum14"&gt;  14:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum15"&gt;  15:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; requiredProvision = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum16"&gt;  16:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum17"&gt;  17:&lt;/span&gt;         SqlConnection connection = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SqlConnection(connectionString);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum18"&gt;  18:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum19"&gt;  19:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;// create a new scope description and add the &lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum20"&gt;  20:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;// appropriate tables to this scope&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum21"&gt;  21:&lt;/span&gt;         DbSyncScopeDescription scopeDesc = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum22"&gt;  22:&lt;/span&gt;             DbSyncScopeDescription(scopeName);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum23"&gt;  23:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum24"&gt;  24:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;// class to be used to provision the scope defined above&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum25"&gt;  25:&lt;/span&gt;         SqlSyncScopeProvisioning scopeProvision = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SqlSyncScopeProvisioning();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum26"&gt;  26:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum27"&gt;  27:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;// Check if this scope already exists on the server and if not &lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum28"&gt;  28:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;// go ahead and provision&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum29"&gt;  29:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!scopeProvision.ScopeExists(scopeName, connection))&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum30"&gt;  30:&lt;/span&gt;         {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum31"&gt;  31:&lt;/span&gt;             requiredProvision = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum32"&gt;  32:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum33"&gt;  33:&lt;/span&gt;             &lt;span style="color:#008000;"&gt;// add the appropriate tables to this scope&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum34"&gt;  34:&lt;/span&gt;             DbSyncTableDescription tableDesc = &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum35"&gt;  35:&lt;/span&gt;                 SqlSyncDescriptionBuilder.GetDescriptionForTable(&lt;span style="color:#006080;"&gt;&amp;quot;authors&amp;quot;&lt;/span&gt;, connection);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum36"&gt;  36:&lt;/span&gt;             scopeDesc.Tables.Add(tableDesc);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum37"&gt;  37:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum38"&gt;  38:&lt;/span&gt;             &lt;span style="color:#008000;"&gt;// note that it is important to call this after the tables &lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum39"&gt;  39:&lt;/span&gt;             &lt;span style="color:#008000;"&gt;// has been added to the scope&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum40"&gt;  40:&lt;/span&gt;             scopeProvision.PopulateFromScopeDescription(scopeDesc);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum41"&gt;  41:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum42"&gt;  42:&lt;/span&gt;             &lt;span style="color:#008000;"&gt;//indicate that the base table already exists and does not need to be created&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum43"&gt;  43:&lt;/span&gt;             scopeProvision.SetCreateTableDefault(DbSyncCreationOption.Skip);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum44"&gt;  44:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum45"&gt;  45:&lt;/span&gt;             &lt;span style="color:#008000;"&gt;//provision the server&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum46"&gt;  46:&lt;/span&gt;             scopeProvision.Apply(connection);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum47"&gt;  47:&lt;/span&gt;         }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum48"&gt;  48:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum49"&gt;  49:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; requiredProvision;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum50"&gt;  50:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum51"&gt;  51:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Our helper takes a connection string to the database where we have tables that we wish to provision. We need to provide an identifier for our synchronisation operation and we do this by creating a DBSyncScopeDescription and a SqlSyncScopeProvisioning. We check if this scope has already been configured in our database and if not – specify the tables that will be part of this synchronisation. When we apply the scope provision, a number of database operations are performed:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Creation of new Table 
    &lt;ul&gt;
      &lt;li&gt;scope_info - This provides a unique identifier (scope_id) for each scope &lt;/li&gt;

      &lt;li&gt;scope_config - This stores configuration information for our new scope. This includes mapping information for stored procedures to create, delete and update records, as well as all the columns that are in the scope. &lt;/li&gt;

      &lt;li&gt;authors_tracking - This is used to track changes to the table in the scope, along with tombstone information for deleted records. &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;

  &lt;li&gt;Creation of Stored Procedures 
    &lt;ul&gt;
      &lt;li&gt;authors_delete – used by the framework to delete the record from the authors table. &lt;/li&gt;

      &lt;li&gt;authors_deletemetadata – used by the framework to delete a record from the authors_tracking table. &lt;/li&gt;

      &lt;li&gt;authors_insert – used by the framework to insert a record into the authors table. &lt;/li&gt;

      &lt;li&gt;authors_insertmetadata – used by the framework to update the authors_tracking table. &lt;/li&gt;

      &lt;li&gt;authors_selectchanges – used by the framework to return records from the authors table since a particular revision. &lt;/li&gt;

      &lt;li&gt;authors_selectrow – used by the framework to return a particular record from the authors table. &lt;/li&gt;

      &lt;li&gt;authors_update – used by the framework to update a record in the authors table. &lt;/li&gt;

      &lt;li&gt;authors_updatemetadata – used by the framework to update a record in the authors_tracking table. &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;

  &lt;li&gt;Creation of triggers on authors table 
    &lt;ul&gt;
      &lt;li&gt;insert trigger called authors_insert_trigger – this inserts a record into the authors_tracking table &lt;/li&gt;

      &lt;li&gt;delete trigger called authors_delete_trigger – this updates the record in authors_tracking as a tombstone. &lt;/li&gt;

      &lt;li&gt;update trigger called authors_update_trigger – this updates the record in author_tracking to capture the local data change &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Creation of these entities through the application is probably fine for a non production application, but in reality you will probably want to script the changes so they can be applied to a production environment.&lt;/p&gt;

&lt;p&gt;The next step is to actually perform the synchronisation between the 2 SQL Server instances. Again – I wrapped the functionality to perform the synchronisation into a helper class and the code looks like:&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// Utility function that will create a SyncOrchestrator and &lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// synchronize the two passed in providers&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;localProvider&amp;quot;&amp;gt;Local store provider&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;remoteProvider&amp;quot;&amp;gt;Remote store provider&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; SyncOperationStatistics SynchronizeProviders(&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;     RelationalSyncProvider localProvider, &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;     RelationalSyncProvider remoteProvider)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt;     SyncOrchestrator orchestrator = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SyncOrchestrator();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum13"&gt;  13:&lt;/span&gt;     orchestrator.LocalProvider = localProvider;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum14"&gt;  14:&lt;/span&gt;     orchestrator.RemoteProvider = remoteProvider;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum15"&gt;  15:&lt;/span&gt;     orchestrator.Direction = SyncDirectionOrder.UploadAndDownload;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum16"&gt;  16:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum17"&gt;  17:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// Perform the synchronisation&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum18"&gt;  18:&lt;/span&gt;     SyncOperationStatistics stats = orchestrator.Synchronize();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum19"&gt;  19:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; stats;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum20"&gt;  20:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;It is very straightforward to create the RelationalSyncProviders needed as parameters.&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// Return a sql sync provider&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;connectionString&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; SqlSyncProvider ConfigureSqlSyncProvider(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; connectionString)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;     SqlSyncProvider provider = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SqlSyncProvider();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;     provider.ScopeName = scopeName;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;     provider.Connection = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SqlConnection(connectionString);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; provider;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum13"&gt;  13:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Next step is to build a simple UI that allows you to maintain the data on either the source or the target, perform a synchronisation and view the results of the synchronisation.&lt;/p&gt;

&lt;div style="padding-bottom:0px;padding-left:0px;width:580px;padding-right:0px;display:block;float:none;margin-left:auto;margin-right:auto;padding-top:0px;" id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:257b0911-59ca-4984-b919-d87b8c43eaf6" class="wlWriterEditableSmartContent"&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/SqltoSqlSync8x6_27C81D89.jpg" title="Sample UI" rel="thumbnail"&gt;&lt;img border="0" src="http://blogs.charteris.com/blogs/ivorb/SqltoSqlSync_2968C390.png" width="580" height="465" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;You should observe the following behaviour:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Perform a sync to ensure the source is in sync with the target. &lt;/li&gt;

  &lt;li&gt;Press Refresh on both the source and the target and ensure that they visually look the same. &lt;/li&gt;

  &lt;li&gt;Alter an author on the source and press Save. When you press Refresh on the source – you should continue to see the new value. &lt;/li&gt;

  &lt;li&gt;Press Refresh on the target and you should continue to see the old value. &lt;/li&gt;

  &lt;li&gt;Press Sync which should synchronise the change from the source to the target. &lt;/li&gt;

  &lt;li&gt;Press Refresh on the target and you should see that the value has been updated with the value from the Source. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The prototype application can be downloaded from &lt;a href="http://blogs.charteris.com/files/folders/samples/entry1448.aspx" target="_blank"&gt;here&lt;/a&gt;. Don’t forget - you will need 2 SQL Server databases – one called pubs and one called pubsCopy, both containing a version of the authors table.&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:972aff21-bc7c-4bb1-991a-c0478bc4bf6d" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Sync+Framework" rel="tag"&gt;Sync Framework&lt;/a&gt;&lt;/div&gt;
&lt;div id="SocialBookmarks"&gt;&lt;a href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f08%2f13%2fsync-framework-2-0-series-part-3-performing-collaborative-synchronisation.aspx&amp;tags=&amp;title=Sync+Framework+2.0+Series+%e2%80%93+Part+3+%e2%80%93+Performing+Collaborative+Synchronisation" mce_href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f08%2f13%2fsync-framework-2-0-series-part-3-performing-collaborative-synchronisation.aspx&amp;tags=&amp;title=Sync+Framework+2.0+Series+%e2%80%93+Part+3+%e2%80%93+Performing+Collaborative+Synchronisation"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/delicious.gif"&gt;Del.icio.us&amp;nbsp;&lt;/a&gt;&lt;a href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f08%2f13%2fsync-framework-2-0-series-part-3-performing-collaborative-synchronisation.aspx&amp;title=Sync+Framework+2.0+Series+%e2%80%93+Part+3+%e2%80%93+Performing+Collaborative+Synchronisation&amp;tags=" mce_href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f08%2f13%2fsync-framework-2-0-series-part-3-performing-collaborative-synchronisation.aspx&amp;title=Sync+Framework+2.0+Series+%e2%80%93+Part+3+%e2%80%93+Performing+Collaborative+Synchronisation&amp;tags="&gt;&lt;img border="0" src="/Themes/leanandgreen/images/digg.gif"&gt;Digg It&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f08%2f13%2fsync-framework-2-0-series-part-3-performing-collaborative-synchronisation.aspx" mce_href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f08%2f13%2fsync-framework-2-0-series-part-3-performing-collaborative-synchronisation.aspx"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/facebook.gif"&gt;Share on Facebook&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f08%2f13%2fsync-framework-2-0-series-part-3-performing-collaborative-synchronisation.aspx&amp;title=Sync+Framework+2.0+Series+%e2%80%93+Part+3+%e2%80%93+Performing+Collaborative+Synchronisation" mce_href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f08%2f13%2fsync-framework-2-0-series-part-3-performing-collaborative-synchronisation.aspx&amp;title=Sync+Framework+2.0+Series+%e2%80%93+Part+3+%e2%80%93+Performing+Collaborative+Synchronisation"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/stumble.gif"&gt;Stumble It!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.charteris.com/aggbug.aspx?PostID=1458" width="1" height="1"&gt;</description><category domain="http://blogs.charteris.com/blogs/ivorb/archive/tags/Sync+Framework/default.aspx">Sync Framework</category></item><item><title>Installing .Net 1.1 applications on Windows Server 2008 R2</title><link>http://blogs.charteris.com/blogs/ivorb/archive/2010/07/15/installing-net-1-1-applications-on-windows-server-2008-r2.aspx</link><pubDate>Thu, 15 Jul 2010 16:17:35 GMT</pubDate><guid isPermaLink="false">0cdfd867-77e4-483c-9e74-84c93cc8eba0:1434</guid><dc:creator>IvorB</dc:creator><slash:comments>6</slash:comments><description>&lt;p&gt;I recently needed to get an ASP.Net 1.1 application working on Windows Server 2008 R2. I naively assumed that this was just going to work but then the whole 32/64 bit problem emerged.&lt;/p&gt;  &lt;p&gt;.Net 1.1 is 32 bit only and Server 2008 R2 is 64 bit only! Well – &lt;a href="http://msdn.microsoft.com/en-us/library/aa384249(VS.85).aspx" target="_blank"&gt;WOW64&lt;/a&gt; has been around quite a while so surely this would be a piece of cake. I proceeded to download the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=262d25e3-f589-4842-8157-034d1e7cf3a3&amp;amp;displaylang=en" target="_blank"&gt;.Net Framework Version 1.1 Redistributable Package&lt;/a&gt; and when you attempt to install – you get your first hint about the potential problems ahead.&lt;/p&gt;  &lt;div style="padding-bottom:0px;padding-left:0px;width:580px;padding-right:0px;display:block;float:none;margin-left:auto;margin-right:auto;padding-top:0px;" id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:70024899-186e-4fff-8db5-d50742a279e2" class="wlWriterEditableSmartContent"&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/CompatibilityIssues8x6_3FC93235.jpg" title=".Net 1.1 compatibility issues on Server 2008 R2" rel="thumbnail"&gt;&lt;img border="0" src="http://blogs.charteris.com/blogs/ivorb/CompatibilityIssues_1671EA37.png" width="580" height="325" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;At this stage – you have 2 choices:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Attempt to upgrade your application to a 64 bit version of the framework &lt;/li&gt;    &lt;li&gt;Attempt to get .Net 1.1 working on Server 2008 R2 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;My preference was to get .Net 1.1 working as I didn’t want to go through a test cycle for an application I didn’t really understand on a new version of the framework. However – rather than just choosing “Run Program” from the Program Compatibility Assistant dialog – I did some research and used the following process to get my application to work.&lt;/p&gt; &lt;strong&gt;   &lt;h4&gt;1 - Install IIS Metabase Compatibility&lt;/h4&gt; &lt;/strong&gt;  &lt;p&gt;To install on Windows 2008 Server – click Start and then “Server Manager”.&lt;/p&gt;  &lt;p&gt;Under Web Server (IIS), click Add Role Services.&lt;/p&gt;  &lt;p&gt;Ensure that IIS Metabase Compatibility is installed.&lt;/p&gt;  &lt;div style="padding-bottom:0px;padding-left:0px;width:580px;padding-right:0px;display:block;float:none;margin-left:auto;margin-right:auto;padding-top:0px;" id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:8839f954-d6c0-4f7a-b5c2-d932222f709c" class="wlWriterEditableSmartContent"&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/MetabaseCompatibility8x6_70D84708.jpg" title="Ensure IIS Metabase is checked" rel="thumbnail"&gt;&lt;img border="0" src="http://blogs.charteris.com/blogs/ivorb/MetabaseCompatibility_65EB3FF3.png" width="580" height="478" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;h4&gt;2 - Install .Net 1.1&lt;/h4&gt;  &lt;p&gt;I installed .Net 1.1 in the following order:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=262d25e3-f589-4842-8157-034d1e7cf3a3&amp;amp;DisplayLang=en" target="_blank"&gt;.Net Framework 1.1.&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=a8f5654f-088e-40b2-bbdb-a83353618b38&amp;amp;DisplayLang=en" target="_blank"&gt;.Net Framework 1.1 Service Pack 1&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=8ec6fb8a-29eb-49cf-9dbc-1a0dc2273ff9&amp;amp;DisplayLang=en" target="_blank"&gt;ASP.Net Security Update for .Net Framework 1.1 Service Pack 1&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I still got a compatibility warning, but chose “Run Program” to continue.&lt;/p&gt;  &lt;p&gt;Installing Service Pack 1 is likely to require a reboot.&lt;/p&gt;  &lt;h4&gt;3 – Enable ASP.Net 1.1 ISAPI Extension&lt;/h4&gt;  &lt;p&gt;Following the steps in option 2 made ASP.NET v1.1.4322 available on my ISAPI and CGI Restrictions dialog, but was disabled by default. Open Internet Explorer, click on your server name and choose ISAPI and CGI Restrictions from the IIS section. Enable ASP.Net v1.1.4322 as a valid ISAPI extension.&lt;/p&gt;  &lt;div style="padding-bottom:0px;padding-left:0px;width:580px;padding-right:0px;display:block;float:none;margin-left:auto;margin-right:auto;padding-top:0px;" id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:df765bde-331e-4ec9-b74e-0c8ba04bf91c" class="wlWriterEditableSmartContent"&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/AllowedExtension8x6_282E326A.jpg" title="Enable ASP.Net 1.1 ISAPI Extension" rel="thumbnail"&gt;&lt;img border="0" src="http://blogs.charteris.com/blogs/ivorb/AllowedExtension_37EDC76E.png" width="580" height="248" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;h4&gt;4 – Adjust machine.config&lt;/h4&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;We need ASP.NET 1.1 to ignore IIS configuration sections, so open machine.config for Framework 1.1 (%windir%\Microsoft.NET\Framework\v1.1.4322\config\machine.config) and add the following towards the end of configSections.&lt;/p&gt;  &lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &amp;lt;section name=&lt;span style="color:#006080;"&gt;&amp;quot;system.webServer&amp;quot;&lt;/span&gt; type=&lt;span style="color:#006080;"&gt;&amp;quot;System.Configuration.IgnoreSectionHandler, &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt;     System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&amp;quot;&lt;/span&gt; /&amp;gt; &lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;h4&gt;5 – Adjust the Application pool&lt;/h4&gt;

&lt;p&gt;I now needed to tell my application to use the application pool ASP.NET 1.1. Use IIS Manager, choose the site that you are working with and choose “Advanced Settings”. Adjust the application pool to use ASP.NET 1.1 which will use .Net Framework 1.1.&lt;/p&gt;

&lt;div style="padding-bottom:0px;padding-left:0px;width:490px;padding-right:0px;display:block;float:none;margin-left:auto;margin-right:auto;padding-top:0px;" id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:f0579300-8f0f-45c6-b5d4-a798b0d50a0b" class="wlWriterEditableSmartContent"&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/ApplicationPool8x6_29CED871.jpg" title="Adjust application pool to ASP.NET 1.1" rel="thumbnail"&gt;&lt;img border="0" src="http://blogs.charteris.com/blogs/ivorb/ApplicationPool_47CCE665.png" width="490" height="609" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h4&gt;6 – Fix applicationHost.config bug&lt;/h4&gt;

&lt;p&gt;IIS runtime detected that I was running on a 64 bit operating system, so it attempted to load .net framework configuration from Microsoft.Net\Framework64, but this doesn’t exist for .Net Framework 1.1. The solution is to copy the 32 bit version into the appropriate 64 bit folder.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Create \Windows\Microsoft.net\Framework64\v1.1.4322\config &lt;/li&gt;

  &lt;li&gt;Copy machine.config from \Windows\Microsoft.net\Framework\v1.1.4322\Config\ &lt;/li&gt;
&lt;/ul&gt;

&lt;div style="padding-bottom:0px;padding-left:0px;width:580px;padding-right:0px;display:block;float:none;margin-left:auto;margin-right:auto;padding-top:0px;" id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:8b2849ed-b4ff-4501-8700-fb8bae940ae8" class="wlWriterEditableSmartContent"&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/FixApplicationHostIssue8x6_4F94D907.jpg" title="Fix applicationHost.config bug" rel="thumbnail"&gt;&lt;img border="0" src="http://blogs.charteris.com/blogs/ivorb/FixApplicationHostIssue_496D8C6C.png" width="580" height="590" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;h4&gt;7 - Check any application registry settings&lt;/h4&gt;

&lt;p&gt;My application relied upon a number of custom application registry settings. In the 32 era – this wasn’t a problem as registry settings were in the “same” expected place. e.g. most people put registry settings under &lt;strong&gt;&lt;em&gt;HKEY_LOCAL_MACHINE \ SOFTWARE &lt;/em&gt;&lt;/strong&gt;someplace&lt;em&gt;.&lt;/em&gt; However – on a 64 bit machine – the 64 bit software settings are stored in this expected place, while 32 bit settings are stored under &lt;strong&gt;&lt;em&gt;HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node.&lt;/em&gt;&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;This is probably easiest to explain by giving an example. My application needed to access &lt;strong&gt;&lt;em&gt;HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ ConfigurationManagement \ hashKey&lt;/em&gt;&lt;/strong&gt;. In order to make this setting available to a 32 bit application running on a 64 bit server, you need to store the key as&amp;#160; &lt;strong&gt;&lt;em&gt;HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ ConfigurationManagement \ hashKey.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I initially exported the keys from an existing Server 2003 machine and imported them onto Server 2008 which put them into &lt;strong&gt;&lt;em&gt;HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ ConfigurationManagement \ hashKey.&lt;/em&gt;&lt;/strong&gt; This is where Windows expects you to store your 64 bit settings, so you need to move them to the corresponding location under Wow6432Node. &lt;/p&gt;

&lt;div style="padding-bottom:0px;padding-left:0px;width:555px;padding-right:0px;display:block;float:none;margin-left:auto;margin-right:auto;padding-top:0px;" id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:eb730975-a1cf-4390-a9d5-c120e137ad95" class="wlWriterEditableSmartContent"&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/32bitregistry8x6_05A62B8A.jpg" title="32 bit registry settings" rel="thumbnail"&gt;&lt;img border="0" src="http://blogs.charteris.com/blogs/ivorb/32bitregistry_70680014.png" width="555" height="609" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;p&gt;This caused a lot of pain and confusion trying to understand why my application couldn’t read registry settings which were obviously there. The solution is to put your 32 bit registry settings where your 32 bit application will attempt to read them – under Wow6432Node.&lt;/p&gt;

&lt;p&gt;Some useful references for understanding the 32/64 bit registry issues are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms724072"&gt;http://msdn.microsoft.com/en-us/library/ms724072&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa384253"&gt;http://msdn.microsoft.com/en-us/library/aa384253&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finally, after following all of the above – my 32 bit .net 1.1 application&amp;#160; was working correctly on Server 2008 R2. &lt;/p&gt;

&lt;h3&gt;Useful links&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc785813(WS.10).aspx" target="_blank"&gt;.NET Framework version 1.1 for 64-bit operating systems&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;span&gt;&lt;a href="http://learn.iis.net/page.aspx/472/how-to-install-aspnet-11-with-iis7-on-vista-and-windows-2008/" target="_blank"&gt;How to install ASP.NET 1.1 with IIS7 on Vista and Windows 2008&lt;/a&gt;&lt;/span&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blogs.iis.net/wonyoo/archive/2009/06/18/workaround-running-asp-net-1-1-on-vista-sp2-ws08-sp2.aspx" target="_blank"&gt;Workaround: Running ASP.NET 1.1 on Vista SP2/WS08 SP2&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms724072" target="_blank"&gt;32 bit and 64 bit application data in the registry&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa384253" target="_blank"&gt;Registry keys affected by WOW64&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:e460c670-aeb7-447b-8997-d6b73d8bfd7e" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Server+2008+R2" rel="tag"&gt;Server 2008 R2&lt;/a&gt;,&lt;a href="http://technorati.com/tags/.Net+1.1" rel="tag"&gt;.Net 1.1&lt;/a&gt;&lt;/div&gt;
&lt;div id="SocialBookmarks"&gt;&lt;a href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f07%2f15%2finstalling-net-1-1-applications-on-windows-server-2008-r2.aspx&amp;tags=&amp;title=Installing+.Net+1.1+applications+on+Windows+Server+2008+R2" mce_href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f07%2f15%2finstalling-net-1-1-applications-on-windows-server-2008-r2.aspx&amp;tags=&amp;title=Installing+.Net+1.1+applications+on+Windows+Server+2008+R2"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/delicious.gif"&gt;Del.icio.us&amp;nbsp;&lt;/a&gt;&lt;a href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f07%2f15%2finstalling-net-1-1-applications-on-windows-server-2008-r2.aspx&amp;title=Installing+.Net+1.1+applications+on+Windows+Server+2008+R2&amp;tags=" mce_href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f07%2f15%2finstalling-net-1-1-applications-on-windows-server-2008-r2.aspx&amp;title=Installing+.Net+1.1+applications+on+Windows+Server+2008+R2&amp;tags="&gt;&lt;img border="0" src="/Themes/leanandgreen/images/digg.gif"&gt;Digg It&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f07%2f15%2finstalling-net-1-1-applications-on-windows-server-2008-r2.aspx" mce_href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f07%2f15%2finstalling-net-1-1-applications-on-windows-server-2008-r2.aspx"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/facebook.gif"&gt;Share on Facebook&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f07%2f15%2finstalling-net-1-1-applications-on-windows-server-2008-r2.aspx&amp;title=Installing+.Net+1.1+applications+on+Windows+Server+2008+R2" mce_href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f07%2f15%2finstalling-net-1-1-applications-on-windows-server-2008-r2.aspx&amp;title=Installing+.Net+1.1+applications+on+Windows+Server+2008+R2"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/stumble.gif"&gt;Stumble It!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.charteris.com/aggbug.aspx?PostID=1434" width="1" height="1"&gt;</description><category domain="http://blogs.charteris.com/blogs/ivorb/archive/tags/.Net+1.1/default.aspx">.Net 1.1</category></item><item><title>CRM 4.0 xRM code generation using CrmSvcUtil</title><link>http://blogs.charteris.com/blogs/alistairl/archive/2010/07/14/crm-4-0-xrm-code-generation-using-crmsvcutil.aspx</link><pubDate>Wed, 14 Jul 2010 15:02:36 GMT</pubDate><guid isPermaLink="false">0cdfd867-77e4-483c-9e74-84c93cc8eba0:1433</guid><dc:creator>alistairl</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;You may have read some of my previous postings on SharePoint, but in my world of Solution Architecture I touch on other products such as SQL Server, Microsoft CRM and whatever else is an appropriate fit to the requirements of client work I am engaged on.&lt;/p&gt;  &lt;p&gt;A recent job for a multinational consultancy was an excellent opportunity to catch up with the Microsoft CRM 4.0 SDK and the tools contained therein. I’ll post separately about the business problems we solved with Microsoft CRM 4.0 and some integration code, but in this article I’ll focus on what I discovered in using the xRM tools included in the recent SDK.&lt;/p&gt;  &lt;p&gt;This isn’t the article to discuss the improvement in the support for developers, but I have to say that the shipping of accelerators that are good enough to be reference material are a great way of supporting the learning process for building on CRM. Hot on the heels of the accelerators have been the SDK improvements to allow you and I to make the most of CRM, and this particular post concentrates on the library class generator CrmSvcUtil.exe.&lt;/p&gt;  &lt;p&gt;When you download and extract the &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=82e632a7-faf9-41e0-8ec1-a2662aae9dfb&amp;amp;displaylang=en"&gt;CRM 4.0 SDK from Microsoft&lt;/a&gt; you will find a microsoft.xrm directory alongside the other collection of directories containing sample code, user interface design guide, SDK help file etc. In that directory are four useful documents: two guides and two walkthroughs giving you as the developer an idea of what is intended by the Microsoft Dynamics CRM 4.0 SDK Advanced Developer Extensions (Microsoft xRM), to give it its full title.&lt;/p&gt;  &lt;p&gt;These documents explain how to use the code generation tool and I’d recommend you read the developer&amp;#39;s guide to get a quick heads up of what is intended by the inclusion of these tools in the SDK. At this stage the documentation is rather “light” but I would expect more detail to emerge in subsequent releases of the SDK. To cut a long story short, CrmSvcUtil is a command line tool that generates a whole pile of classes from your CRM instance. This is important, because as well as creating classes for managing the built-in entities, it also generates them for your custom entities. This does of course generate a minor configuration management headache, and I’ll post an article later on what we have implemented,with recommendations for integrating this with automated build in order to ensure that your generated classes keep pace with what your entity developers are doing.&lt;/p&gt;  &lt;p&gt;It took me a few tries to get the right combination of parameters to get the class output I needed. In particular I found that I had to get the dataContextPrefix exactly correct in order for the correct classes to be included. I created a number of different sets of files either singly or collectively that represented the entity activities but these depend on certain shared classes that I found were not included in all parameter combinations.&lt;/p&gt;  &lt;p&gt;Additionally I discovered, through using the tool, that it will prompt for missing parameters provided essentials like the server name have been specified. As I mentioned earlier the tool can create separate c# files for each entity, but with getting on for almost 200 entities (not including any custom ones), I found the generation of a single .cs file preferable from a logistics point of view.&lt;/p&gt;  &lt;p&gt;In the end I settled down to a command line like the following:&lt;/p&gt;  &lt;p&gt;crmsvcutil.exe /connectionString:&amp;quot;Authentication Type=AD; Server=https://crm.microsoft.com/Woodgrove User ID=WOODGROVE\devaccount; Password=***&amp;quot; /out:&amp;quot;Xrm.cs&amp;quot; /namespace:Xrm /dataContextPrefix:Xrm&lt;/p&gt;  &lt;p&gt;This will generate a single class file called xrm.cs based on reading the entities in the specified organisation on the specified server. A full description of the parameters can be found in the Advanced Developer Extensions Developers Guide. A word of warning though, the file isn’t small – with a full set of standard entities and custom entitities the xrm.cs file generated out at just over 4Mb.&lt;/p&gt;  &lt;p&gt;The great thing about this approach is that, as the generated code runs off your organisation in your CRM, it picks up not only your custom entities but also the changes that you have made to customisable entities. In my opinion, this makes it a lot easier to get up to speed with concentrating on the business logic and specifics of integrating with CRM rather than crafting your own way through wrapping up the CRM web services. I’d recommend having a look and running the generation tool to see if the classes it provides would have helped to make your last CRM development project easier, and will make your next a lot easier. In follow-up posts I hope to take a step back to talk about the business requirement we satisfied with this technology, but also perhaps take a step sideways and describe how this code generation can fit into an overall governance policy for regular build and test using Team Foundation Server.&lt;/p&gt;
&lt;div id="SocialBookmarks"&gt;&lt;a href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2falistairl%2farchive%2f2010%2f07%2f14%2fcrm-4-0-xrm-code-generation-using-crmsvcutil.aspx&amp;tags=&amp;title=CRM+4.0+xRM+code+generation+using+CrmSvcUtil" mce_href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2falistairl%2farchive%2f2010%2f07%2f14%2fcrm-4-0-xrm-code-generation-using-crmsvcutil.aspx&amp;tags=&amp;title=CRM+4.0+xRM+code+generation+using+CrmSvcUtil"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/delicious.gif"&gt;Del.icio.us&amp;nbsp;&lt;/a&gt;&lt;a href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2falistairl%2farchive%2f2010%2f07%2f14%2fcrm-4-0-xrm-code-generation-using-crmsvcutil.aspx&amp;title=CRM+4.0+xRM+code+generation+using+CrmSvcUtil&amp;tags=" mce_href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2falistairl%2farchive%2f2010%2f07%2f14%2fcrm-4-0-xrm-code-generation-using-crmsvcutil.aspx&amp;title=CRM+4.0+xRM+code+generation+using+CrmSvcUtil&amp;tags="&gt;&lt;img border="0" src="/Themes/leanandgreen/images/digg.gif"&gt;Digg It&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2falistairl%2farchive%2f2010%2f07%2f14%2fcrm-4-0-xrm-code-generation-using-crmsvcutil.aspx" mce_href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2falistairl%2farchive%2f2010%2f07%2f14%2fcrm-4-0-xrm-code-generation-using-crmsvcutil.aspx"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/facebook.gif"&gt;Share on Facebook&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2falistairl%2farchive%2f2010%2f07%2f14%2fcrm-4-0-xrm-code-generation-using-crmsvcutil.aspx&amp;title=CRM+4.0+xRM+code+generation+using+CrmSvcUtil" mce_href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2falistairl%2farchive%2f2010%2f07%2f14%2fcrm-4-0-xrm-code-generation-using-crmsvcutil.aspx&amp;title=CRM+4.0+xRM+code+generation+using+CrmSvcUtil"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/stumble.gif"&gt;Stumble It!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.charteris.com/aggbug.aspx?PostID=1433" width="1" height="1"&gt;</description><category domain="http://blogs.charteris.com/blogs/alistairl/archive/tags/Microsoft+Dynamics+CRM+4.0/default.aspx">Microsoft Dynamics CRM 4.0</category><category domain="http://blogs.charteris.com/blogs/alistairl/archive/tags/Visual+Studio+2008/default.aspx">Visual Studio 2008</category><category domain="http://blogs.charteris.com/blogs/alistairl/archive/tags/xRM/default.aspx">xRM</category><category domain="http://blogs.charteris.com/blogs/alistairl/archive/tags/SDK/default.aspx">SDK</category><category domain="http://blogs.charteris.com/blogs/alistairl/archive/tags/c_2300_/default.aspx">c#</category></item><item><title>Sync Framework 2.0 Series – Part 2 – Using Local Database Caching for an occasionally connected application.</title><link>http://blogs.charteris.com/blogs/ivorb/archive/2010/07/08/sync-framework-2-0-series-part-2-using-local-database-caching-for-an-occasionally-connected-application.aspx</link><pubDate>Thu, 08 Jul 2010 16:11:17 GMT</pubDate><guid isPermaLink="false">0cdfd867-77e4-483c-9e74-84c93cc8eba0:1432</guid><dc:creator>IvorB</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;This is part 2 in the Sync Framework 2.0 series and deals with building an occasionally connected application using Local Database Caching. Part 1 in the series dealt with installing the Sync Framework and using the File Sync Provider.&lt;/p&gt;  &lt;p&gt;My original goal with this post was to see if I could use the Sync Framework to build a C# version of SQL Replication to keep two SQL Server databases in sync. However – I found a limited amount of information available in the public domain, so I have decided to take an initial step into SQL Synchronisation by building an “occasionally connected application” using Local Database Caching. The basic idea is to build something like the following:&lt;/p&gt;  &lt;div style="padding-bottom:0px;padding-left:0px;width:326px;padding-right:0px;display:block;float:none;margin-left:auto;margin-right:auto;padding-top:0px;" id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:ef4e978a-ceed-4e8b-ae5a-8c2f0f9621c7" class="wlWriterEditableSmartContent"&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/DisconnectedApplication8x6_7411A71E.jpg" title="3 clients using an occasionally connected application" rel="thumbnail"&gt;&lt;img border="0" src="http://blogs.charteris.com/blogs/ivorb/DisconnectedApplication_23E63306.png" width="326" height="627" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;Users of the application can work in local mode where all their changes are persisted to a local database, and at intervals they can sync their changes back to the main corporate database. The best initial source of information I found for this type of application was on MDSN called “&lt;a href="http://msdn.microsoft.com/en-us/library/bb384436.aspx" target="_blank"&gt;Occasionally Connected Applications&lt;/a&gt;” – an excellent series of articles that discuss various aspects of this topic. The manner you approach this type of application depends upon what technologies you are going to use to build it – for my example – I’m going to use SQL Server 2008 R2, Visual Studio 2010 and of course – Sync Framework 2.0.&lt;/p&gt;  &lt;p&gt;When it comes to tracking database changes, there are 2 general approaches that can be taken.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Add columns and triggers to the tables being monitored. &lt;/li&gt;    &lt;li&gt;Use SQL Server Change Tracking &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;In general – I find Database Administrators quite reluctant to add columns to tables for this kind of work. Generally – the application is in production when someone decides that they would like to be able to add a disconnected approach, and it is often considered to risky to add these additional tracking columns and triggers. Other people don’t like mixing the data we need to store for an entity with metadata we use to embellish an entity. For this reason – I’m going to focus on using SQL Server Change Tracking and further details on change tracking can be found on &lt;a href="http://msdn.microsoft.com/en-us/library/bb933994.aspx" target="_blank"&gt;MSDN&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;First step is to choose the data that your application needs to work with. I wanted an example that was as simple as possible so I chose the pubs database. pubs isn’t installed by default on SQL Server 2008, so I had to download the database from &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=06616212-0356-46a0-8da2-eebc53a68034&amp;amp;displaylang=en" target="_blank"&gt;Microsoft&lt;/a&gt;. After attaching to SQL Server 2008 – I came across my first stumbling block – using the Local Database Caching wizard (more on this later) didn’t detect it as a database which I could use SQL Server Change Tracking on as “Use SQL Server change tracking” was disabled.&lt;/p&gt;  &lt;div style="padding-bottom:0px;padding-left:0px;width:580px;padding-right:0px;display:block;float:none;margin-left:auto;margin-right:auto;padding-top:0px;" id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:1841a039-a39c-4943-9f2c-c24129d7bf98" class="wlWriterEditableSmartContent"&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/DisabledChangeTracking8x6_35761DD1.jpg" title="Use SQL Server change tracking is disabled" rel="thumbnail"&gt;&lt;img border="0" src="http://blogs.charteris.com/blogs/ivorb/DisabledChangeTracking_5E9DB60F.png" width="580" height="476" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;I struggled to find useful information on the internet about this using my favourite search engine (perhaps I was using poor search criteria?), but in the end I made a lucky guess – perhaps it didn’t like my database as it wasn’t really a SQL Server 2008 database? It was really a SQL Server 2000 database attached to SQL Server 2008. I quickly created a new database and used the Data Import Wizard to copy the “authors” table from pubs to my new database and while this was a step forwards as “Use SQL Server change tracking was now enabled”, my next stumbling block was that it wouldn’t let me add a new Cached Table - the Add button was disabled!&lt;/p&gt;  &lt;div style="padding-bottom:0px;padding-left:0px;width:580px;padding-right:0px;display:block;float:none;margin-left:auto;margin-right:auto;padding-top:0px;" id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:b943bf62-8979-463e-be1d-11e024db99c7" class="wlWriterEditableSmartContent"&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/NoPrimaryKey8x6_2230675D.jpg" title="Add button is disabled" rel="thumbnail"&gt;&lt;img border="0" src="http://blogs.charteris.com/blogs/ivorb/NoPrimaryKey_6168A54F.png" width="580" height="481" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;More lost time using my favourite search engine and another lucky guess solved my problem – perhaps it was to do with the way my authors table was created. The Data Import Wizard created my table as well as copying the contents, and it decided not to create a primary key. Sync Framework likes primary keys so a quick “Add Primary Key” operation later – and the Local Database Caching wizard was a lot happier.&lt;/p&gt;  &lt;p&gt;To recap – when you are choosing your data source which you wish to use for an occasionally connection application and you want to use SQL Server Change Tracking – make sure its SQL Server 2008 and you have a primary key on any table that you want to synchronise.&lt;/p&gt;  &lt;p&gt;Now we have our data that we want to synchronise – let’s start building our application. I’m going to use a simple WinForms Desktop application. Tweak the default form so we have a tab control with 2 tabs – one to display the contents on the server and one to display the contents on our client and some buttons to perform useful operations. I’ve built the following:&lt;/p&gt;  &lt;div style="padding-bottom:0px;padding-left:0px;width:580px;padding-right:0px;display:block;float:none;margin-left:auto;margin-right:auto;padding-top:0px;" id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:c1bffbcc-099b-447c-8331-7602009a1d4d" class="wlWriterEditableSmartContent"&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/SampleApplication8x6_4F7BEBB5.jpg" title="My sample application" rel="thumbnail"&gt;&lt;img border="0" src="http://blogs.charteris.com/blogs/ivorb/SampleApplication_6CA193BF.png" width="580" height="462" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;Right click the project and choose “Add New Item” and on the Data section – choose “Local Database Caching”. This will bring up the “Configure Data Synchronisation” wizard where you specify the data that you wish to use. Specify the Server connection for the source of the data and the Client connection should default to a new Compact database. Choose the table which you wish to cache by clicking the Add button. The dialog should look something like the following:&lt;/p&gt;  &lt;div style="padding-bottom:0px;padding-left:0px;width:580px;padding-right:0px;display:block;float:none;margin-left:auto;margin-right:auto;padding-top:0px;" id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:d81ac453-76ac-4fd5-bf69-2f2a37dd7bde" class="wlWriterEditableSmartContent"&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/CorrectConfiguration8x6_2D7A4D8A.jpg" title="Configure Data Synchronisation dialog with my values" rel="thumbnail"&gt;&lt;img border="0" src="http://blogs.charteris.com/blogs/ivorb/CorrectConfiguration_0BAE74F9.png" width="580" height="478" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Next step in the wizard is to choose the database model, and I went with the Dataset approach. This is good for getting a prototype up and running, but if you are building something for a production environment – you might want to consider using an Entity Data Model.&lt;/p&gt;  &lt;div style="padding-bottom:0px;padding-left:0px;width:580px;padding-right:0px;display:block;float:none;margin-left:auto;margin-right:auto;padding-top:0px;" id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:4a670581-938e-420e-b0cf-98b7cc35d647" class="wlWriterEditableSmartContent"&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/DatabaseModel8x6_6247072D.jpg" title="Choose Dataset as your database model" rel="thumbnail"&gt;&lt;img border="0" src="http://blogs.charteris.com/blogs/ivorb/DatabaseModel_15A2CA8A.png" width="580" height="501" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;You end up with a typed dataset for the local version of the authors table. Visual Studio will have added references to Microsoft.Synchronisation, Microsoft.Synchronisation.Data, Microsoft.Synchronisation.Server and Microsoft.Synchronisation.ServerCe but it managed to completely screw up the references on my machine. I’m working on a 64 bit machine and it created a strange hybrid of 32 and 64 bit references. I manually removed and re-added all 64 bit references on my machine and then changed the target platform to be “Any CPU” (It had defaulted to x86).&lt;/p&gt;  &lt;p&gt;Next step is populate the client DataGridView and this requires minimal coding. I have 2 form level variables as follows:&lt;/p&gt;  &lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#cc6633;"&gt;#region&lt;/span&gt; Variables&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; AuthorsDataSet authorsClientDataSet = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; AuthorsDataSet();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; AuthorsDataSetTableAdapters.AuthorsTableAdapter authorsClientAdapter = &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; AuthorsDataSetTableAdapters.AuthorsTableAdapter();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt; &lt;span style="color:#cc6633;"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;In the event handler for the click event for the populate button on the client tab – I have the following code:&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// Populate the client data grid view control&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;sender&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;e&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; buttonClientAuthorsPopulate_Click(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;         authorsClientAdapter.Fill(authorsClientDataSet.Authors);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.dataGridViewClientAuthors.DataSource = authorsClientDataSet.Authors;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum13"&gt;  13:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum14"&gt;  14:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; (Exception Ex)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum15"&gt;  15:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum16"&gt;  16:&lt;/span&gt;         MessageBox.Show(&lt;span style="color:#006080;"&gt;&amp;quot;Failed to populate the client - perhaps the client compact &amp;quot;&lt;/span&gt; +&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum17"&gt;  17:&lt;/span&gt;             &lt;span style="color:#006080;"&gt;&amp;quot;database hasn&amp;#39;t been created yet!&amp;quot;&lt;/span&gt; + Environment.NewLine + Ex.Message);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum18"&gt;  18:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum19"&gt;  19:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;To make our prototype easy to test – it’s useful to be able to change and save the data using the application (rather than testing by changing the data directly in the database), so I implemented the save functionality for the client as follows:&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// Save any changes on the client&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;sender&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;e&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; buttonClientSave_Click(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Validate();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.dataGridViewClientAuthors.EndEdit();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.authorsClientAdapter.Update(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.authorsClientDataSet);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum13"&gt;  13:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum14"&gt;  14:&lt;/span&gt;         PopulateClient();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum15"&gt;  15:&lt;/span&gt;         MessageBox.Show(&lt;span style="color:#006080;"&gt;&amp;quot;Saved&amp;quot;&lt;/span&gt;);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum16"&gt;  16:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum17"&gt;  17:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt;(Exception ex)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum18"&gt;  18:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum19"&gt;  19:&lt;/span&gt;         MessageBox.Show(&lt;span style="color:#006080;"&gt;&amp;quot;Error &amp;quot;&lt;/span&gt; + ex.Message);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum20"&gt;  20:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum21"&gt;  21:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;In order to make the server tab work, I decided to manually add a typed dataset for the server version of the authors table. There were a number of ways I could have made the server tab work, but using a typed dataset meant that the code looked very similar to the client version.&lt;/p&gt;

&lt;p&gt;You should now have working versions of the server and client tabs which allow you to view, change and save values. Next step is to implement the Synchronisation functionality – we want the user to be able to perform synchronisations between their local database and the central server database. Initial implementation for performing the synchronisation is very straightforward:&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// Perform a database change sync between our client and the server.&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;sender&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;e&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; buttonSync_Click(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;     AuthorCacheSyncAgent syncAgent = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; AuthorCacheSyncAgent();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;     Microsoft.Synchronization.Data.SyncStatistics syncStats = syncAgent.Synchronize();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt;     PopulateServer();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt;     PopulateClient();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum13"&gt;  13:&lt;/span&gt;     &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum14"&gt;  14:&lt;/span&gt;     StringBuilder message = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; StringBuilder();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum15"&gt;  15:&lt;/span&gt;     message.Append(&lt;span style="color:#006080;"&gt;&amp;quot;Changes downloaded: &amp;quot;&lt;/span&gt;);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum16"&gt;  16:&lt;/span&gt;     message.Append(syncStats.TotalChangesDownloaded.ToString());&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum17"&gt;  17:&lt;/span&gt;     message.AppendLine();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum18"&gt;  18:&lt;/span&gt;     message.Append(&lt;span style="color:#006080;"&gt;&amp;quot;Changes uploaded: &amp;quot;&lt;/span&gt;);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum19"&gt;  19:&lt;/span&gt;     message.Append(syncStats.TotalChangesUploaded.ToString());&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum20"&gt;  20:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum21"&gt;  21:&lt;/span&gt;     MessageBox.Show(message.ToString());&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum22"&gt;  22:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;When I tried to run my application for the first time – it failed with the following error: “&lt;strong&gt;&lt;em&gt;The specified change tracking operation is not supported. To carry out this operation on the table, disable the change tracking on the table, and enable the change tracking.&lt;/em&gt;&lt;/strong&gt;” More frantic searching but at least I found other people having the same problem. The easiest way to get rid of this exception is to set the “Copy to Output Directory” for your local compact database to “Do not copy”.&lt;/p&gt;

&lt;p&gt;You should now have a working “occasionally connected application” which can synchronise changes from the server to your client. However – what if you want to be able to synchronise both ways? This is actually easy to achieve – you just need to implement the OnInitialized() method in the cache file that the wizard generated.&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// Code generated Sync Agent which we can extend&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;partial&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; AuthorCacheSyncAgent &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;/// Initialise the sync agent to perform a bidirectional sync.&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;partial&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; OnInitialized()&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt;         Authors.SyncDirection = SyncDirection.Bidirectional;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum13"&gt;  13:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;This allows you to perform a 2 way sync. However – what happens if you change a record on both the server and the client and perform a sync. The behaviour you should find is that the server always wins and the client change is thrown away. What happens if this isn’t the behaviour you require? You can add custom conflict handling by extending the client and server sync provider that the wizard generated. Delve into the generated code to find the names of the client and server providers, and create a partial class for the client provider as follows:&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// Extends the code generated client sync provider for authors.&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;partial&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; AuthorCacheClientSyncProvider&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;/// Allows the main form to configure the event handler for the &lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;/// ApplyChangeFailed event&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; AddHandlers()&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.ApplyChangeFailed +=&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum13"&gt;  13:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; System.EventHandler&amp;lt;ApplyChangeFailedEventArgs&amp;gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum14"&gt;  14:&lt;/span&gt;             (AuthorCacheClientSyncProvider_ApplyChangeFailed);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum15"&gt;  15:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum16"&gt;  16:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum17"&gt;  17:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum18"&gt;  18:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;/// Allow the client to win a conflict by choosing to continue.&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum19"&gt;  19:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum20"&gt;  20:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;sender&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum21"&gt;  21:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;e&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum22"&gt;  22:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; AuthorCacheClientSyncProvider_ApplyChangeFailed(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender,&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum23"&gt;  23:&lt;/span&gt;         Microsoft.Synchronization.Data.ApplyChangeFailedEventArgs e)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum24"&gt;  24:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum25"&gt;  25:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum26"&gt;  26:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (e.Conflict.ConflictType ==&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum27"&gt;  27:&lt;/span&gt;             Microsoft.Synchronization.Data.ConflictType.ClientUpdateServerUpdate)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum28"&gt;  28:&lt;/span&gt;         {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum29"&gt;  29:&lt;/span&gt;             e.Action = Microsoft.Synchronization.Data.ApplyAction.Continue;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum30"&gt;  30:&lt;/span&gt;         }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum31"&gt;  31:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum32"&gt;  32:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Similarly – create a partial class for the server provider as follows:&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// Extend the server sync provider for authors to allow a client to win a conflict.&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;partial&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; AuthorCacheServerSyncProvider&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;/// Hooks up the ApplyChangeFailed event handler.&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;partial&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; OnInitialized()&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.ApplyChangeFailed +=&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; System.EventHandler&amp;lt;ApplyChangeFailedEventArgs&amp;gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum13"&gt;  13:&lt;/span&gt;             (AuthorCacheServerSyncProvider_ApplyChangeFailed);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum14"&gt;  14:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum15"&gt;  15:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum16"&gt;  16:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum17"&gt;  17:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;/// When a conflict occurs, force write the client change.&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum18"&gt;  18:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum19"&gt;  19:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;sender&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum20"&gt;  20:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;e&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum21"&gt;  21:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; AuthorCacheServerSyncProvider_ApplyChangeFailed(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender,&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum22"&gt;  22:&lt;/span&gt;         Microsoft.Synchronization.Data.ApplyChangeFailedEventArgs e)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum23"&gt;  23:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum24"&gt;  24:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (e.Conflict.ConflictType ==&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum25"&gt;  25:&lt;/span&gt;             Microsoft.Synchronization.Data.ConflictType.ClientUpdateServerUpdate)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum26"&gt;  26:&lt;/span&gt;         {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum27"&gt;  27:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; message = &lt;span style="color:#006080;"&gt;&amp;quot;A client/server conflict was detected at the server.&amp;quot;&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum28"&gt;  28:&lt;/span&gt;             MessageBox.Show(message);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum29"&gt;  29:&lt;/span&gt;             e.Action = Microsoft.Synchronization.Data.ApplyAction.RetryWithForceWrite;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum30"&gt;  30:&lt;/span&gt;         }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum31"&gt;  31:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum32"&gt;  32:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Finally you need to tweak the implementation to perform the synchronisation as follows:&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// Perform a database change sync between our client and the server.&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;sender&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;e&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; buttonSync_Click(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;     AuthorCacheSyncAgent syncAgent = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; AuthorCacheSyncAgent();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;     AuthorCacheClientSyncProvider clientSyncProvider = &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;         (AuthorCacheClientSyncProvider)syncAgent.LocalProvider;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt;     clientSyncProvider.AddHandlers();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum13"&gt;  13:&lt;/span&gt;     Microsoft.Synchronization.Data.SyncStatistics syncStats = syncAgent.Synchronize();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum14"&gt;  14:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum15"&gt;  15:&lt;/span&gt;     PopulateServer();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum16"&gt;  16:&lt;/span&gt;     PopulateClient();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum17"&gt;  17:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum18"&gt;  18:&lt;/span&gt;     StringBuilder message = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; StringBuilder();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum19"&gt;  19:&lt;/span&gt;     message.Append(&lt;span style="color:#006080;"&gt;&amp;quot;Changes downloaded: &amp;quot;&lt;/span&gt;);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum20"&gt;  20:&lt;/span&gt;     message.Append(syncStats.TotalChangesDownloaded.ToString());&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum21"&gt;  21:&lt;/span&gt;     message.AppendLine();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum22"&gt;  22:&lt;/span&gt;     message.Append(&lt;span style="color:#006080;"&gt;&amp;quot;Changes uploaded: &amp;quot;&lt;/span&gt;);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum23"&gt;  23:&lt;/span&gt;     message.Append(syncStats.TotalChangesUploaded.ToString());&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum24"&gt;  24:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum25"&gt;  25:&lt;/span&gt;     MessageBox.Show(message.ToString());&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum26"&gt;  26:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;The latest implementation now means that the client always wins and the server change is throw away.. In reality you might want to prompt the user or log the details and allow manual intervention, but at least we can control how we manage the conflict.&lt;/p&gt;

&lt;p&gt;This prototype application can be downloaded from &lt;a href="http://blogs.charteris.com/files/folders/samples/entry1431.aspx" target="_blank"&gt;here&lt;/a&gt;. You will need to create a SQL Server 2008 database with an Authors table containing the standard authors information. I used a SQL ConnectionString for a user called sqlsync but you can edit these in the app.config.&lt;/p&gt;

&lt;p&gt;Hopefully you will agree with me that using the Local Database Cache means that we don’t have to write much code in order to produce a working occasionally connected application.&amp;#160; However – the main problems are limited example in the public domain and some puzzling times when things don’t work quite as expected!&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:5580c88e-9e71-4e13-8fae-6e9f899a0032" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Sync+Framework" rel="tag"&gt;Sync Framework&lt;/a&gt;&lt;/div&gt;
&lt;div id="SocialBookmarks"&gt;&lt;a href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f07%2f08%2fsync-framework-2-0-series-part-2-using-local-database-caching-for-an-occasionally-connected-application.aspx&amp;tags=&amp;title=Sync+Framework+2.0+Series+%e2%80%93+Part+2+%e2%80%93+Using+Local+Database+Caching+for+an+occasionally+connected+application." mce_href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f07%2f08%2fsync-framework-2-0-series-part-2-using-local-database-caching-for-an-occasionally-connected-application.aspx&amp;tags=&amp;title=Sync+Framework+2.0+Series+%e2%80%93+Part+2+%e2%80%93+Using+Local+Database+Caching+for+an+occasionally+connected+application."&gt;&lt;img border="0" src="/Themes/leanandgreen/images/delicious.gif"&gt;Del.icio.us&amp;nbsp;&lt;/a&gt;&lt;a href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f07%2f08%2fsync-framework-2-0-series-part-2-using-local-database-caching-for-an-occasionally-connected-application.aspx&amp;title=Sync+Framework+2.0+Series+%e2%80%93+Part+2+%e2%80%93+Using+Local+Database+Caching+for+an+occasionally+connected+application.&amp;tags=" mce_href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f07%2f08%2fsync-framework-2-0-series-part-2-using-local-database-caching-for-an-occasionally-connected-application.aspx&amp;title=Sync+Framework+2.0+Series+%e2%80%93+Part+2+%e2%80%93+Using+Local+Database+Caching+for+an+occasionally+connected+application.&amp;tags="&gt;&lt;img border="0" src="/Themes/leanandgreen/images/digg.gif"&gt;Digg It&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f07%2f08%2fsync-framework-2-0-series-part-2-using-local-database-caching-for-an-occasionally-connected-application.aspx" mce_href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f07%2f08%2fsync-framework-2-0-series-part-2-using-local-database-caching-for-an-occasionally-connected-application.aspx"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/facebook.gif"&gt;Share on Facebook&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f07%2f08%2fsync-framework-2-0-series-part-2-using-local-database-caching-for-an-occasionally-connected-application.aspx&amp;title=Sync+Framework+2.0+Series+%e2%80%93+Part+2+%e2%80%93+Using+Local+Database+Caching+for+an+occasionally+connected+application." mce_href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f07%2f08%2fsync-framework-2-0-series-part-2-using-local-database-caching-for-an-occasionally-connected-application.aspx&amp;title=Sync+Framework+2.0+Series+%e2%80%93+Part+2+%e2%80%93+Using+Local+Database+Caching+for+an+occasionally+connected+application."&gt;&lt;img border="0" src="/Themes/leanandgreen/images/stumble.gif"&gt;Stumble It!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.charteris.com/aggbug.aspx?PostID=1432" width="1" height="1"&gt;</description><category domain="http://blogs.charteris.com/blogs/ivorb/archive/tags/Sync+Framework/default.aspx">Sync Framework</category></item><item><title>Sync Framework 2.0 Series – Part 1 – Using the File Sync Provider</title><link>http://blogs.charteris.com/blogs/ivorb/archive/2010/07/05/sync-framework-2-0-series-part-1-using-the-file-sync-provider.aspx</link><pubDate>Mon, 05 Jul 2010 13:21:53 GMT</pubDate><guid isPermaLink="false">0cdfd867-77e4-483c-9e74-84c93cc8eba0:1429</guid><dc:creator>IvorB</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;This is the beginning of what will hopefully become a series of posts about Microsoft Sync Framework 2.0.&lt;/p&gt;  &lt;p&gt;Microsoft Sync Framework is “A comprehensive synchronization platform that enables collaboration and offline access for applications, services, and devices with support for any data type, any data store, any transfer protocol, and any network topology”. I wanted to use the sync framework recently but struggled to find really good content using my favourite search engine. I decided to work through some of the samples in the SDK and try and explore around some of the issues, and hopefully my experiences will help jump-start others who wish to use the platform. &lt;/p&gt;  &lt;p&gt;The best place to start reading is on msdn at the &lt;a title="Microsoft Sync Framework Developer Center" href="http://msdn.microsoft.com/en-us/sync/"&gt;Microsoft Sync Framework Developer Center&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;One of the first things you will want to do is download the Sync Framework 2.0 SDK and this can be found at: &lt;a title="Download the SDK" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=89adbb1e-53ff-41b5-ba17-8e43a2e66254&amp;amp;displaylang=en"&gt;Sync Framework 2.0 SDK&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;I’m using Visual Studio 2010 to develop a Windows Forms application so the first thing I needed to do was add a reference to &lt;strong&gt;Microsoft.Synchronisation &lt;/strong&gt;and &lt;strong&gt;Microsoft.Synchronisation.Files&lt;/strong&gt;. However – a gotcha (at least on my machine) are that the available references on the .Net tab are for Sync Framework 1.0. Its worth checking the Path column on the Add References dialog to make sure you are adding a reference to Sync Framework 2.0. In the end – I did a Browse to the SDK folder and added my reference that way. Some constructors etc have changed subtly from version 1.0, so you need to use the right sample with the right version of the SDK to make things a bit easier.&lt;/p&gt;  &lt;p&gt;Another gotcha that I came across is that my Visual Studio 2010 defaulted my Windows Forms Application to a platform target of x86 despite the fact that I was using a 64 bit machine. This became an issue as I had installed the 64 bit version of the Sync Framework SDK, so I started getting run time exceptions like the following: &lt;em&gt;&lt;strong&gt;&amp;quot;Retrieving the COM class factory for component with CLSID {C201C012-C929-4D72-B9C5-341D48630630} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).&amp;quot;&lt;/strong&gt;. &lt;/em&gt;After a lot of frustration – I found by changing the platform target to “Any CPU”, my run time COM error went away. &lt;/p&gt;  &lt;div style="padding-bottom:0px;padding-left:0px;width:420px;padding-right:0px;display:block;float:none;margin-left:auto;margin-right:auto;padding-top:0px;" id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:13d58f2d-b005-4b1c-9893-926421c83204" class="wlWriterEditableSmartContent"&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/TargetPlatform8x6_73ABED7E.jpg" title="I had to change my target platform" rel="thumbnail"&gt;&lt;img border="0" src="http://blogs.charteris.com/blogs/ivorb/TargetPlatform_406FB415.png" width="420" height="297" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;I think the issue is created by the managed implementation actually being a wrapper around the real non managed implementation, so when I installed the 64 bit version of the SDK – I got the 64 bit registry entries. When Visual Studio built the 32 bit version of the application – it couldn’t find the 32 bit registry entries and gave me a run time error.&lt;/p&gt;  &lt;p&gt;I wanted to build an example that looked and worked a bit like &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=C26EFA36-98E0-4EE9-A7C5-98D0592D8C52&amp;amp;displaylang=en"&gt;SyncToy&lt;/a&gt;. If you are unfamiliar with SyncToy – its “a free application that synchronizes files and folders between locations. Typical uses include sharing files, such as photos, with other computers and creating backup copies of files and folders.” and is actually built with Sync Framework 2.0. &lt;/p&gt;  &lt;div style="padding-bottom:0px;padding-left:0px;width:420px;padding-right:0px;display:block;float:none;margin-left:auto;margin-right:auto;padding-top:0px;" id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:9b1931c8-4bca-4b5a-9ef5-3e416d654f89" class="wlWriterEditableSmartContent"&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/MicrosoftSyncToy8x6_1CF30FB0.jpg" title="Microsoft Synctoy 2.1" rel="thumbnail"&gt;&lt;img border="0" src="http://blogs.charteris.com/blogs/ivorb/MicrosoftSyncToy_134AA17A.png" width="420" height="388" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;So some might ask the question – why build something when a solution already exists and my answer is that its allows me to extend the solution beyond SyncToy. e.g. It would be relatively easy to extend my solution to use a Windows service and FileSystemWatchers to detect changes to the file system and automatically initiate a synchronisation. SyncToy simply initiates a synchronisation on demand.&lt;/p&gt;  &lt;p&gt;My example prompts the user for a source and target folder, and the user can press a button to synchronise the files between the 2 folders. To get a simple example working, you need to create a FileSyncProvider for the source folder, a FileSyncProvider for your target folder and a SyncOrchestrator to perform the synchronisation operation. I’ve put my code into a class, and my button click event handler calls it.&lt;/p&gt;  &lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// Perform a simple synchronisation&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; SimpleSyncHelper&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;/// Perform the synchronisation&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;sourceFolder&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;targetFolder&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; PerformSynchronisation(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; sourceFolder, &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; targetFolder)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum13"&gt;  13:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum14"&gt;  14:&lt;/span&gt;         FileSyncProvider sourceProvider = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; FileSyncProvider(sourceFolder);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum15"&gt;  15:&lt;/span&gt;         FileSyncProvider targetProvider = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; FileSyncProvider(targetFolder);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum16"&gt;  16:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum17"&gt;  17:&lt;/span&gt;         SyncOrchestrator agent = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SyncOrchestrator();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum18"&gt;  18:&lt;/span&gt;         agent.LocalProvider = sourceProvider;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum19"&gt;  19:&lt;/span&gt;         agent.RemoteProvider = targetProvider;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum20"&gt;  20:&lt;/span&gt;         &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum21"&gt;  21:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;// Perform 2 way sync&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum22"&gt;  22:&lt;/span&gt;         agent.Direction = SyncDirectionOrder.UploadAndDownload; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum23"&gt;  23:&lt;/span&gt;         agent.Synchronize();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum24"&gt;  24:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum25"&gt;  25:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;This works really well but when I looked at the file synchronisation example from the SDK, it was coded differently and the piece that attracted my attention was: “&lt;strong&gt;&lt;em&gt;Explicitly detect changes on both replicas upfront, to avoid two change detection passes for the two-way sync&lt;/em&gt;&lt;/strong&gt;”. It turns out that the implementation of SyncOrchestrator-Synchronize() actually splits the operation into 2 – 1 to perform the upload and 1 to perform the download. When it performs the upload part – it detects changes on both the source and the target, and when it performs the download part – it detects changes on both the source and target. This effectively means that 4 “detect change” operations are performed and explains why the SDK sample was keen to avoid the two change detection phases.&lt;/p&gt;

&lt;p&gt;To prove to yourself that the code performs as above, hook up a DetectingChanges event handler for both the sourceProvider and the targetProvider and add a MessageBox.Show() to the handler and you should observer 4 message boxes.&lt;/p&gt;

&lt;p&gt;To get around the two change detection passes, you should perform an explicit detection on both the source and the target. &lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// Perform a DetectChange operation on a FileSyncProvider.&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;replicaRootPath&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;filter&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;options&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; DetectChangesOnFileSystemReplica(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; replicaRootPath, &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;     FileSyncScopeFilter filter, FileSyncOptions options)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (FileSyncProvider provider = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; FileSyncProvider(replicaRootPath,&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt;         filter, options))&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum13"&gt;  13:&lt;/span&gt;         provider.DetectChanges();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum14"&gt;  14:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum15"&gt;  15:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;The Framework captures the change information which can then be used later in the synchronisation process. You can then change your code that instead of performing a SyncDirectionOrder of UploadAndDownload – you perform 2 SyncDirectionOrder with a value of Upload – once between the source and the target and once between the target and the source. Make sure you use the FileSyncOptions.ExplicitDetectChanges to prevent unnecessary change detection passes.&lt;/p&gt;

&lt;p&gt;As well as the DetectingChanges event, there are a number of other EventHandlers that you can hook up on a FileSyncProvider to get useful information:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;ApplyingChange – occurs when a change is about to be applied. &lt;/li&gt;

  &lt;li&gt;AppliedChange – occurs when a change has been applied &lt;/li&gt;

  &lt;li&gt;SkippedChange – occurs when a change is skipped. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The return value from a SyncOrchestration – Synchronise() operation is of type SyncOperationStatistics and it contains useful information about the changes applied as part of the synchronisation. This could be used to display a report for the user after the synchronisation operation. It contains properties like:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;UploadChangesApplied – total number of changes that were successfully applied during the upload session. &lt;/li&gt;

  &lt;li&gt;DownloadChangesApplied – total number of changes that were successfully applied during the download session. &lt;/li&gt;

  &lt;li&gt;SyncStartTime – when the synchronisation started. &lt;/li&gt;

  &lt;li&gt;SyncEndTime – when the synchronisation ended. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So far – we have seen how we can listen for events occurring as part of the synchronisation, and get details for a report at the end of the synchronisation, but what if we want to display a progress bar to indicate to the user how long is left in the synchronisation process? The Sync Framework doesn’t provide this kind of functionality by default as it would incur a reasonable overhead which would be wasted for those who do not require it. However – the FileSyncProvider does provide a preview mode! When this is set to true – it performs all the work of calculating what changes need to be made without actually performing the changes. This allows us to perform the operation initially in preview mode to calculate what changes need to be applied (which we can access by looking at the SyncOperationStatistics), we can capture the events from the operation and display accurate progress information to the user. &lt;/p&gt;

&lt;p&gt;I’ve put all of the above information into a sample application that looks like the following:&lt;/p&gt;

&lt;div style="padding-bottom:0px;padding-left:0px;width:420px;padding-right:0px;display:block;float:none;margin-left:auto;margin-right:auto;padding-top:0px;" id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:64f547d5-a179-4ee5-81e2-a7253a4800a0" class="wlWriterEditableSmartContent"&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/SampleFileApplication8x6_5D9A420E.jpg" title="My sample application" rel="thumbnail"&gt;&lt;img border="0" src="http://blogs.charteris.com/blogs/ivorb/SampleFileApplication_326CE2CD.png" width="420" height="287" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;p&gt;The source code for this sample application can be downloaded from &lt;a title="FileSyncProviderSamples" href="http://blogs.charteris.com/files/folders/samples/entry1428.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Hopefully future posts in this series will demonstrate the use of other providers in Microsoft Sync Framework 2.0.&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:1129ec4e-2200-42b8-9e81-befdbd893a25" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Sync+Framework" rel="tag"&gt;Sync Framework&lt;/a&gt;&lt;/div&gt;
&lt;div id="SocialBookmarks"&gt;&lt;a href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f07%2f05%2fsync-framework-2-0-series-part-1-using-the-file-sync-provider.aspx&amp;tags=&amp;title=Sync+Framework+2.0+Series+%e2%80%93+Part+1+%e2%80%93+Using+the+File+Sync+Provider" mce_href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f07%2f05%2fsync-framework-2-0-series-part-1-using-the-file-sync-provider.aspx&amp;tags=&amp;title=Sync+Framework+2.0+Series+%e2%80%93+Part+1+%e2%80%93+Using+the+File+Sync+Provider"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/delicious.gif"&gt;Del.icio.us&amp;nbsp;&lt;/a&gt;&lt;a href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f07%2f05%2fsync-framework-2-0-series-part-1-using-the-file-sync-provider.aspx&amp;title=Sync+Framework+2.0+Series+%e2%80%93+Part+1+%e2%80%93+Using+the+File+Sync+Provider&amp;tags=" mce_href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f07%2f05%2fsync-framework-2-0-series-part-1-using-the-file-sync-provider.aspx&amp;title=Sync+Framework+2.0+Series+%e2%80%93+Part+1+%e2%80%93+Using+the+File+Sync+Provider&amp;tags="&gt;&lt;img border="0" src="/Themes/leanandgreen/images/digg.gif"&gt;Digg It&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f07%2f05%2fsync-framework-2-0-series-part-1-using-the-file-sync-provider.aspx" mce_href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f07%2f05%2fsync-framework-2-0-series-part-1-using-the-file-sync-provider.aspx"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/facebook.gif"&gt;Share on Facebook&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f07%2f05%2fsync-framework-2-0-series-part-1-using-the-file-sync-provider.aspx&amp;title=Sync+Framework+2.0+Series+%e2%80%93+Part+1+%e2%80%93+Using+the+File+Sync+Provider" mce_href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f07%2f05%2fsync-framework-2-0-series-part-1-using-the-file-sync-provider.aspx&amp;title=Sync+Framework+2.0+Series+%e2%80%93+Part+1+%e2%80%93+Using+the+File+Sync+Provider"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/stumble.gif"&gt;Stumble It!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.charteris.com/aggbug.aspx?PostID=1429" width="1" height="1"&gt;</description><category domain="http://blogs.charteris.com/blogs/ivorb/archive/tags/Sync+Framework/default.aspx">Sync Framework</category></item><item><title>Windows PowerShell Series - Part 8 – Working with Variables</title><link>http://blogs.charteris.com/blogs/ivorb/archive/2010/06/29/windows-powershell-series-part-8-working-with-variables.aspx</link><pubDate>Tue, 29 Jun 2010 13:49:09 GMT</pubDate><guid isPermaLink="false">0cdfd867-77e4-483c-9e74-84c93cc8eba0:1422</guid><dc:creator>IvorB</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;This is part 8 in a series of posts related to Windows PowerShell, and deals with working with Variables.&lt;/p&gt;  &lt;p&gt;Those from a programming background will be very used to dealing with variables – it is something we take for granted when doing development. Without variables – it would be very difficult to write any useful scripts as we wouldn’t have anyplace to remember working values.&lt;/p&gt;  &lt;p&gt;Variables in Windows PowerShell are prefixed with the dollar sign ($).Variable names are not case sensitive but you should be consistent to make your life easier. By default – any variables you create will exist only in the current session and will be lost when you end your session. There are 4 types of variable:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Automatic – these are created and maintained by Windows PowerShell and users cannot change their values. e.g. $PSHome stores the path to the Windows PowerShell installation directory. &lt;/li&gt;    &lt;li&gt;Preference – these are created by Windows PowerShell with default values which the user can change. e.g. $MaximumVariableCount determines how many variables are permitted in a given session. &lt;/li&gt;    &lt;li&gt;Environment – these store information about the operating system environment. To list all environment variables – use Get-ChildItem Env:      &lt;br /&gt;or to get details about a particular environment variable – use Get-ChildItem Env:ComputerName &lt;/li&gt;    &lt;li&gt;User created – these are variable which are created and maintained by the user. When someone refers to a variable – they usually mean this type of variable. e.g. $Today = (Get-Date).date &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Windows PowerShell variables are loosely typed which mean they are not limited to a particular variable type of object. The type of a variable is determined by the value it contains. e.g.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/Variables1_6EAAA511.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="Variables1" border="0" alt="Variables1" src="http://blogs.charteris.com/blogs/ivorb/Variables1_thumb_5D0A9479.jpg" width="584" height="220" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;In general – most programming languages (like C#) are strongly typed. There can be a number of advantages that using strong types can bring:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Limit the range of values that a variable can contain. e.g. limiting a variable like $Age to integer values. Compilers and other tools can check that we are putting sensible values into appropriate variables. &lt;/li&gt;    &lt;li&gt;Improved clarify. e.g. if a “+” operation is performed on 2 integer variables -&amp;#160; then we always need to perform an addition. If a “+” operation is performed on 2 string variables – then we always need to perform a string concatenation. With loose/weak typing – the operation depends on the contents of the variables so isn’t always clear. &lt;/li&gt;    &lt;li&gt;Improved Performance – optimisations can often be made when the type is known in advance rather than being determined “on the fly” &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Windows PowerShell allows us to use the type attribute and cast syntax to constrain a variable to a particular type. Some examples include:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/Variables2_3A6655FE.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="Variables2" border="0" alt="Variables2" src="http://blogs.charteris.com/blogs/ivorb/Variables2_thumb_1D308827.jpg" width="746" height="377" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;There are a number of Cmdlets which are designed for manipulating variables. These include:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Clear-Variable – Deletes the value for a variable&lt;/li&gt;    &lt;li&gt;Get-Variable – Gets the variables in the current console&lt;/li&gt;    &lt;li&gt;New-Variable – Creates a new variable&lt;/li&gt;    &lt;li&gt;Remove-Variable – Deletes a variable and its value&lt;/li&gt;    &lt;li&gt;Set-Variable – Changes the value of a variable.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/Variables3_181E24AB.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="Variables3" border="0" alt="Variables3" src="http://blogs.charteris.com/blogs/ivorb/Variables3_thumb_160125E2.jpg" width="747" height="305" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Windows PowerShell allows us to create constant and read-only variables. While constants and read-only variables are functionality very similar – one difference is that you can delete a read-only variable while you cannot delete a constant. To create constants and read-only variables, use:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/Variables4_60A7EDAF.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="Variables4" border="0" alt="Variables4" src="http://blogs.charteris.com/blogs/ivorb/Variables4_thumb_01D7E38C.jpg" width="750" height="225" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;See the following for useful information about PowerShell variables:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/dd347604.aspx" target="_blank"&gt;about variables&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/dd347675.aspx" target="_blank"&gt;about automatic variables&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/dd347713.aspx" target="_blank"&gt;about environment variables&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/dd347731.aspx" target="_blank"&gt;about preference variables&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Next step – Working with Logic&lt;/p&gt;  &lt;p&gt;&lt;font color="#800080"&gt;&lt;a title="Previous Step" href="http://blogs.charteris.com/blogs/ivorb/archive/2010/06/25/windows-powershell-series-part-7-what-the-heck-is-a-cmdlet.aspx"&gt;Previous step&lt;/a&gt;&lt;/font&gt; – What the heck is a Cmdlet?&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:fee73300-ece9-459e-9313-77e17766a8e5" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/PowerShell" rel="tag"&gt;PowerShell&lt;/a&gt;&lt;/div&gt;
&lt;div id="SocialBookmarks"&gt;&lt;a href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f06%2f29%2fwindows-powershell-series-part-8-working-with-variables.aspx&amp;tags=&amp;title=Windows+PowerShell+Series+-+Part+8+%e2%80%93+Working+with+Variables" mce_href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f06%2f29%2fwindows-powershell-series-part-8-working-with-variables.aspx&amp;tags=&amp;title=Windows+PowerShell+Series+-+Part+8+%e2%80%93+Working+with+Variables"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/delicious.gif"&gt;Del.icio.us&amp;nbsp;&lt;/a&gt;&lt;a href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f06%2f29%2fwindows-powershell-series-part-8-working-with-variables.aspx&amp;title=Windows+PowerShell+Series+-+Part+8+%e2%80%93+Working+with+Variables&amp;tags=" mce_href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f06%2f29%2fwindows-powershell-series-part-8-working-with-variables.aspx&amp;title=Windows+PowerShell+Series+-+Part+8+%e2%80%93+Working+with+Variables&amp;tags="&gt;&lt;img border="0" src="/Themes/leanandgreen/images/digg.gif"&gt;Digg It&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f06%2f29%2fwindows-powershell-series-part-8-working-with-variables.aspx" mce_href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f06%2f29%2fwindows-powershell-series-part-8-working-with-variables.aspx"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/facebook.gif"&gt;Share on Facebook&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f06%2f29%2fwindows-powershell-series-part-8-working-with-variables.aspx&amp;title=Windows+PowerShell+Series+-+Part+8+%e2%80%93+Working+with+Variables" mce_href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f06%2f29%2fwindows-powershell-series-part-8-working-with-variables.aspx&amp;title=Windows+PowerShell+Series+-+Part+8+%e2%80%93+Working+with+Variables"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/stumble.gif"&gt;Stumble It!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.charteris.com/aggbug.aspx?PostID=1422" width="1" height="1"&gt;</description><category domain="http://blogs.charteris.com/blogs/ivorb/archive/tags/PowerShell/default.aspx">PowerShell</category></item><item><title>Windows PowerShell Series - Part 7 – What the heck is a Cmdlet?</title><link>http://blogs.charteris.com/blogs/ivorb/archive/2010/06/25/windows-powershell-series-part-7-what-the-heck-is-a-cmdlet.aspx</link><pubDate>Fri, 25 Jun 2010 15:14:42 GMT</pubDate><guid isPermaLink="false">0cdfd867-77e4-483c-9e74-84c93cc8eba0:1420</guid><dc:creator>IvorB</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;This is part 7 in a series of posts related to Windows PowerShell, and deals with cmdlets.&lt;/p&gt;  &lt;p&gt;Cmdlets (pronounced command-lets) are the smallest units of functionality in Windows PowerShell. They are named in a very specific verb-noun format that should make it obvious what operation the cmdlet performs. &lt;/p&gt;  &lt;p&gt;e.g. Get-Date returns the current date and time while Set-Date allows you to set the current date and time.&lt;/p&gt;  &lt;p&gt;A useful cmdlet when starting out with Windows PowerShell is Get-Command which returns a complete list of available cmdlets.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/GetCommand_0B121FB2.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Get-Command" border="0" alt="Get-Command" src="http://blogs.charteris.com/blogs/ivorb/GetCommand_thumb_5EE4FCF3.jpg" width="644" height="341" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The example above also demonstrates pipelining where the output from the Get-Command cmdlet is piped (or redirected) to Format-Wide&lt;/p&gt;  &lt;p&gt;Get-Help is also useful in discovering information about available cmdlets, and its output includes some summary information about each cmdlet.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/GetHelp_38DF26D0.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Get-Help" border="0" alt="Get-Help" src="http://blogs.charteris.com/blogs/ivorb/GetHelp_thumb_710D781B.jpg" width="644" height="310" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;To get detailed information about a particular cmdlet, use Get-Help “cmdlet name”.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/GetHelp_1C41E956.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Get-Help" border="0" alt="Get-Help" src="http://blogs.charteris.com/blogs/ivorb/GetHelp_thumb_205B9B4E.jpg" width="644" height="286" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;There are 2 other variations of Get-Help which provide different levels of information for a cmdlet:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Get-Help “cmdlet” –detailed &lt;/li&gt;    &lt;li&gt;Get-Help “cmdlet” –full &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;You can pass parameters to a cmdlet by using the a dash (-) notation. e.g. if you want to get the current date, but not include the time aspect, you can use the following:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/cmdletparameters_740EEE9C.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="cmdlet parameters" border="0" alt="cmdlet parameters" src="http://blogs.charteris.com/blogs/ivorb/cmdletparameters_thumb_71F1EFD3.jpg" width="644" height="100" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Some standard cmdlets which I recommend looking at include:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Get-Command – Get information about cmdlets &lt;/li&gt;    &lt;li&gt;Get-EventLog – Gets events fro man event log &lt;/li&gt;    &lt;li&gt;Write-EventLog – Writes an event to the event log &lt;/li&gt;    &lt;li&gt;Get-Host – Gets information about the host application &lt;/li&gt;    &lt;li&gt;Get-Location – Gets information about your current working location. &lt;/li&gt;    &lt;li&gt;Get-Variable – Gets a particular variable &lt;/li&gt;    &lt;li&gt;Ping-Computer – Sends a ping &lt;/li&gt;    &lt;li&gt;Read-Host – Reads information from the host window &lt;/li&gt;    &lt;li&gt;Write-Host – Writes information to the host window. &lt;/li&gt;    &lt;li&gt;Start-Service – starts a particular service &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Use Get-Help *-* to discover other useful cmdlets.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/archive/2010/06/29/windows-powershell-series-part-8-working-with-variables.aspx"&gt;Next step&lt;/a&gt; – Working with Variables&lt;/p&gt;  &lt;p&gt;&lt;font color="#0066cc"&gt;&lt;a title="Previous Step" href="http://blogs.charteris.com/blogs/ivorb/archive/2010/05/11/windows-powershell-series-part-6-getting-to-grips-with-scripts.aspx"&gt;Previous step&lt;/a&gt;&lt;/font&gt; – Getting to grips with Scripts&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:172584f8-8dd8-4580-a5b1-949d503488c2" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/PowerShell" rel="tag"&gt;PowerShell&lt;/a&gt;&lt;/div&gt;
&lt;div id="SocialBookmarks"&gt;&lt;a href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f06%2f25%2fwindows-powershell-series-part-7-what-the-heck-is-a-cmdlet.aspx&amp;tags=&amp;title=Windows+PowerShell+Series+-+Part+7+%e2%80%93+What+the+heck+is+a+Cmdlet%3f" mce_href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f06%2f25%2fwindows-powershell-series-part-7-what-the-heck-is-a-cmdlet.aspx&amp;tags=&amp;title=Windows+PowerShell+Series+-+Part+7+%e2%80%93+What+the+heck+is+a+Cmdlet%3f"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/delicious.gif"&gt;Del.icio.us&amp;nbsp;&lt;/a&gt;&lt;a href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f06%2f25%2fwindows-powershell-series-part-7-what-the-heck-is-a-cmdlet.aspx&amp;title=Windows+PowerShell+Series+-+Part+7+%e2%80%93+What+the+heck+is+a+Cmdlet%3f&amp;tags=" mce_href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f06%2f25%2fwindows-powershell-series-part-7-what-the-heck-is-a-cmdlet.aspx&amp;title=Windows+PowerShell+Series+-+Part+7+%e2%80%93+What+the+heck+is+a+Cmdlet%3f&amp;tags="&gt;&lt;img border="0" src="/Themes/leanandgreen/images/digg.gif"&gt;Digg It&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f06%2f25%2fwindows-powershell-series-part-7-what-the-heck-is-a-cmdlet.aspx" mce_href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f06%2f25%2fwindows-powershell-series-part-7-what-the-heck-is-a-cmdlet.aspx"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/facebook.gif"&gt;Share on Facebook&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f06%2f25%2fwindows-powershell-series-part-7-what-the-heck-is-a-cmdlet.aspx&amp;title=Windows+PowerShell+Series+-+Part+7+%e2%80%93+What+the+heck+is+a+Cmdlet%3f" mce_href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f06%2f25%2fwindows-powershell-series-part-7-what-the-heck-is-a-cmdlet.aspx&amp;title=Windows+PowerShell+Series+-+Part+7+%e2%80%93+What+the+heck+is+a+Cmdlet%3f"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/stumble.gif"&gt;Stumble It!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.charteris.com/aggbug.aspx?PostID=1420" width="1" height="1"&gt;</description><category domain="http://blogs.charteris.com/blogs/ivorb/archive/tags/PowerShell/default.aspx">PowerShell</category></item><item><title>Doctor Strange SPN</title><link>http://blogs.charteris.com/blogs/colinn/archive/2010/06/17/doctor-strange-spn.aspx</link><pubDate>Thu, 17 Jun 2010 20:51:00 GMT</pubDate><guid isPermaLink="false">0cdfd867-77e4-483c-9e74-84c93cc8eba0:1419</guid><dc:creator>colinn</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Or how I stopped worrying and learned to love Kerberos.&lt;/p&gt;  &lt;p&gt;There&amp;#39;s been a lot written on configuring Excel Services 2010 and I by no means claim to be an expert on it. However, having just gone through SPN hell trying to get delegation up and running between SharePoint and an SQL Analysis Server I thought I&amp;#39;d share. Turns out there are a couple of items I needed to know but are missing from other posts. &lt;/p&gt;  &lt;p&gt;First item worthy of note is that &lt;b&gt;all Kerberos delegation for data refresh relies on the Claims to Windows Token Service.&lt;/b&gt; So this has to be up and happy before going any further. &lt;/p&gt;  &lt;p&gt;The second noteworthy point is that &lt;b&gt;all delegation must use the Constrained method&lt;/b&gt; which isn&amp;#39;t as painful as it sounds but isn&amp;#39;t particularly intuitive either. &lt;/p&gt;  &lt;p&gt;The steps I followed were: &lt;/p&gt;  &lt;p&gt;1) Check the &lt;b&gt;Claims to Windows Service&lt;/b&gt; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;It should be running on all Excel Calculations Servers. &lt;/li&gt;    &lt;li&gt;It should be set to Automatic. &lt;/li&gt;    &lt;li&gt;It should be using the &lt;b&gt;Local System&lt;/b&gt; account. This might look odd but it&amp;#39;s the only account the service will run under properly. &lt;/li&gt; &lt;/ul&gt; 2) Identify service accounts. You&amp;#39;ll need:   &lt;ul&gt;   &lt;li&gt;The service account for excel services (e.g. random\excelservices) &lt;/li&gt;    &lt;li&gt;The service account for the data server (e.g. random\sqlservice) &lt;/li&gt; &lt;/ul&gt; 3) Either use the &lt;b&gt;SETSPN tool&lt;/b&gt; or the &lt;b&gt;ADSIEDIT console&lt;/b&gt; to create &lt;b&gt;Service Principal Names (SPNs)&lt;/b&gt; from the command line to set up SPNs for each service account. For example if the excel services are on http://App1.randomcom:   &lt;br /&gt;&lt;b&gt;Setspn -a HTTP/App1&amp;#160;&amp;#160;&amp;#160;&amp;#160; random\excelservices&lt;/b&gt;   &lt;br /&gt;&lt;b&gt;Setspn -a HTTP/App1.random.com&amp;#160;&amp;#160;&amp;#160;&amp;#160; random\excelservices&lt;/b&gt;   &lt;br /&gt;  &lt;br /&gt;And add SPNs for the back end services,Starting with the Analysis Services:   &lt;br /&gt;&lt;b&gt;Setspn -a MSOLAPSvc.3/SQL1&amp;#160;&amp;#160;&amp;#160;&amp;#160; random\sqlService&lt;/b&gt;   &lt;br /&gt;&lt;b&gt;Setspn -a MSOLAPSvc.3/SQL1.random.com&amp;#160;&amp;#160;&amp;#160;&amp;#160; random\sqlservice&lt;/b&gt;   &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;And then the MSSQL Server:   &lt;br /&gt;&lt;b&gt;Setspn -a MSSQLSvc/SQL1:1433&amp;#160;&amp;#160;&amp;#160;&amp;#160; random\sqlservice&lt;/b&gt;   &lt;br /&gt;&lt;b&gt;Setspn -a MSSQLSvc/SQL1.random.com:1433&amp;#160;&amp;#160;&amp;#160;&amp;#160; random\sqlservice&lt;/b&gt;   &lt;br /&gt;  &lt;br /&gt;4) Set up constrained delegation for &lt;b&gt;Claims to Windows Token Service&lt;/b&gt; and the &lt;b&gt;Excel Service Application&lt;/b&gt;.   &lt;ul&gt;   &lt;li&gt;In &lt;b&gt;Active Directory Users and Computers&lt;/b&gt; find the server running Excel Calculation Services and open its properties. &lt;/li&gt;    &lt;li&gt;Click the &lt;b&gt;Delegation&lt;/b&gt; tab. Select the &lt;b&gt;Trust the computer for delegation to specific services only&lt;/b&gt; and under this the radio button &lt;b&gt;Use any authentication protocol&lt;/b&gt;. This does seem counter intuitive especially as the other option is &lt;i&gt;Use Kerberos only&lt;/i&gt; but no matter the temptation if you don&amp;#39;t select &lt;b&gt;&amp;quot;any&amp;quot;&lt;/b&gt; then delegation won&amp;#39;t work for Excel Services. &lt;/li&gt;    &lt;li&gt;Click on the &lt;b&gt;Add&lt;/b&gt; button the &lt;b&gt;Add Services&lt;/b&gt; dialog will appear. Click on &lt;b&gt;Users or Computers&lt;/b&gt; to bring up the &lt;b&gt;Select Users or Computers&lt;/b&gt; dialog box. &lt;/li&gt;    &lt;li&gt;Now enter either the SQL Server service account or if SQL services are running under Local System the SQL Server name(SQL1). &lt;/li&gt;    &lt;li&gt;On pressing &lt;b&gt;OK&lt;/b&gt; you&amp;#39;ll be returned to the &lt;b&gt;Add Services&lt;/b&gt; box which will now have the SQL Server or Analysis Server registered as a service type. Select the service and press &lt;b&gt;OK&lt;/b&gt;. &lt;/li&gt;    &lt;li&gt;You will be returned the Properties dialog for the Excel Services server. Under the &lt;b&gt;Delegation&lt;/b&gt; tab you will now see the SQL Service registered as one the account can now present delegated credential. &lt;/li&gt;    &lt;li&gt;Repeat this step for the Excel Services service account. &lt;/li&gt; &lt;/ul&gt;  &lt;br /&gt;Repeat for each Excel Services service yu have running and each server you want to delegate credentials between.   &lt;br /&gt;  &lt;br /&gt;And that&amp;#39;s it, hopefully.  
&lt;div id="SocialBookmarks"&gt;&lt;a href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f06%2f17%2fdoctor-strange-spn.aspx&amp;tags=&amp;title=Doctor+Strange+SPN" mce_href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f06%2f17%2fdoctor-strange-spn.aspx&amp;tags=&amp;title=Doctor+Strange+SPN"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/delicious.gif"&gt;Del.icio.us&amp;nbsp;&lt;/a&gt;&lt;a href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f06%2f17%2fdoctor-strange-spn.aspx&amp;title=Doctor+Strange+SPN&amp;tags=" mce_href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f06%2f17%2fdoctor-strange-spn.aspx&amp;title=Doctor+Strange+SPN&amp;tags="&gt;&lt;img border="0" src="/Themes/leanandgreen/images/digg.gif"&gt;Digg It&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f06%2f17%2fdoctor-strange-spn.aspx" mce_href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f06%2f17%2fdoctor-strange-spn.aspx"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/facebook.gif"&gt;Share on Facebook&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f06%2f17%2fdoctor-strange-spn.aspx&amp;title=Doctor+Strange+SPN" mce_href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f06%2f17%2fdoctor-strange-spn.aspx&amp;title=Doctor+Strange+SPN"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/stumble.gif"&gt;Stumble It!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.charteris.com/aggbug.aspx?PostID=1419" width="1" height="1"&gt;</description></item><item><title>Windows PowerShell Series - Part 6 – Getting to grips with Scripts</title><link>http://blogs.charteris.com/blogs/ivorb/archive/2010/05/11/windows-powershell-series-part-6-getting-to-grips-with-scripts.aspx</link><pubDate>Tue, 11 May 2010 14:13:09 GMT</pubDate><guid isPermaLink="false">0cdfd867-77e4-483c-9e74-84c93cc8eba0:966</guid><dc:creator>IvorB</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;This is part 6 in a series of posts related to Windows PowerShell, and deals with getting to grips with scripts..&lt;/p&gt;  &lt;p&gt;So far – we have been typing commands into the PowerShell console (or the ISE) but what happens if you want to create some functionality which you can reload at a future session. The answer is to create your PowerShell commands as a PowerShell script.&lt;/p&gt;  &lt;p&gt;You can either go hard-core and use something like Notepad (or your text editor of choice) to create the script, or you can use the ISE to create and save your script. When saving the script – give it a “.ps1” file extension so PowerShell knows that it’s a script file and not a text file. The extension comes from PowerShell 1.0 and they didn’t feel the need to change the extension for PowerShell 2.0. As you would expect – PowerShell 2.0 can run PowerShell 1.0 scripts, but the reverse is not guaranteed.&lt;/p&gt;  &lt;p&gt;Let’s start with our first script – the typical Hello World script!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/HelloWorld_26166482.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="HelloWorld" border="0" alt="HelloWorld" src="http://blogs.charteris.com/blogs/ivorb/HelloWorld_thumb_03DE58FC.jpg" width="644" height="415" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Save this as HelloWorld.ps1 (or similar). To make your life easier for the moment – make sure there is no space in the file name or anywhere in the path that contains the file name. We’ll worry about handling spaces in a later post.&lt;/p&gt;  &lt;p&gt;The logic for this script is extremely simple:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Clear the output &lt;/li&gt;    &lt;li&gt;Prompt the user their name and store in a variable &lt;/li&gt;    &lt;li&gt;Say hello and repeat the users name by accessing the variable. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;You have a number of choices to run this script:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Run it from inside the ISE by pressing F5 &lt;/li&gt;    &lt;li&gt;Run it from inside the ISE or PowerShell Console by typing the script name (including path) into the command prompt &lt;/li&gt;    &lt;li&gt;Run it from a standard console prompt by using the following: powershell [FilePath]\HelloWorld.ps1 where [FilePath] is your relevant directory structure. In my case – my script is stored on my desktop so I’m executing powershell c:\Users\IvorB\Desktop\HelloWorld.ps1&amp;quot; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;There you go – you should now have a working Hello World script!&lt;/p&gt;  &lt;p&gt;As mentioned in Part 4 of this blog series – security measures are in place to prevent scripts executing without your permission. You have 2 choices at this stage – to digital sign your script, or to adjust your execution policy to allow execution of unsigned scripts. The easiest (and laziest) way to get this to work is to change the execution policy which you can do with the following command:&lt;/p&gt;  &lt;p&gt;Set-ExecutionPolicy RemoteSigned.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/archive/2010/06/25/windows-powershell-series-part-7-what-the-heck-is-a-cmdlet.aspx"&gt;Next step&lt;/a&gt; – What the heck is a Cmdlet?&lt;/p&gt;  &lt;p&gt;&lt;a title="Previous Step" href="http://blogs.charteris.com/blogs/ivorb/archive/2010/05/10/windows-powershell-series-part-5-the-integrated-shell-environment-ise.aspx"&gt;Previous step&lt;/a&gt; – The Integrated Shell Environment (ISE)&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:19fee603-9745-4046-b4d5-43c83d6169c9" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/PowerShell" rel="tag"&gt;PowerShell&lt;/a&gt;&lt;/div&gt;
&lt;div id="SocialBookmarks"&gt;&lt;a href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f05%2f11%2fwindows-powershell-series-part-6-getting-to-grips-with-scripts.aspx&amp;tags=&amp;title=Windows+PowerShell+Series+-+Part+6+%e2%80%93+Getting+to+grips+with+Scripts" mce_href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f05%2f11%2fwindows-powershell-series-part-6-getting-to-grips-with-scripts.aspx&amp;tags=&amp;title=Windows+PowerShell+Series+-+Part+6+%e2%80%93+Getting+to+grips+with+Scripts"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/delicious.gif"&gt;Del.icio.us&amp;nbsp;&lt;/a&gt;&lt;a href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f05%2f11%2fwindows-powershell-series-part-6-getting-to-grips-with-scripts.aspx&amp;title=Windows+PowerShell+Series+-+Part+6+%e2%80%93+Getting+to+grips+with+Scripts&amp;tags=" mce_href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f05%2f11%2fwindows-powershell-series-part-6-getting-to-grips-with-scripts.aspx&amp;title=Windows+PowerShell+Series+-+Part+6+%e2%80%93+Getting+to+grips+with+Scripts&amp;tags="&gt;&lt;img border="0" src="/Themes/leanandgreen/images/digg.gif"&gt;Digg It&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f05%2f11%2fwindows-powershell-series-part-6-getting-to-grips-with-scripts.aspx" mce_href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f05%2f11%2fwindows-powershell-series-part-6-getting-to-grips-with-scripts.aspx"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/facebook.gif"&gt;Share on Facebook&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f05%2f11%2fwindows-powershell-series-part-6-getting-to-grips-with-scripts.aspx&amp;title=Windows+PowerShell+Series+-+Part+6+%e2%80%93+Getting+to+grips+with+Scripts" mce_href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f05%2f11%2fwindows-powershell-series-part-6-getting-to-grips-with-scripts.aspx&amp;title=Windows+PowerShell+Series+-+Part+6+%e2%80%93+Getting+to+grips+with+Scripts"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/stumble.gif"&gt;Stumble It!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.charteris.com/aggbug.aspx?PostID=966" width="1" height="1"&gt;</description><category domain="http://blogs.charteris.com/blogs/ivorb/archive/tags/PowerShell/default.aspx">PowerShell</category></item><item><title>Windows PowerShell Series - Part 5 – The Integrated Shell Environment (ISE)</title><link>http://blogs.charteris.com/blogs/ivorb/archive/2010/05/10/windows-powershell-series-part-5-the-integrated-shell-environment-ise.aspx</link><pubDate>Mon, 10 May 2010 15:52:56 GMT</pubDate><guid isPermaLink="false">0cdfd867-77e4-483c-9e74-84c93cc8eba0:962</guid><dc:creator>IvorB</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;This is part 5 in a series of posts related to Windows PowerShell, and deals with using the Integrated Shell Environment.&lt;/p&gt;  &lt;p&gt;So far we have been using the PowerShell Command Shell to execute PowerShell statements but you also have the option of using the Integrated Shell Environment.This is a more graphical rich interface for using PowerShell.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://blogs.charteris.com/blogs/ivorb/PowerShellISE_006BE63D.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="PowerShellISE" border="0" alt="PowerShellISE" src="http://blogs.charteris.com/blogs/ivorb/PowerShellISE_thumb_48D6254E.jpg" width="592" height="484" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;You can launch it in similar ways to the PowerShell Command Shell:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;All Programs &amp;gt; Accessories &amp;gt; Windows PowerShell &amp;gt; Windows PowerShell ISE &lt;/li&gt;    &lt;li&gt;From a command line prompt (e.g. cmd), type powershell_ise (note the underscore) &lt;/li&gt;    &lt;li&gt;Start menu &amp;gt; Search &amp;gt; type powershell_ise (note the underscore) &lt;/li&gt;    &lt;li&gt;[Win] + R (for Run command) &amp;gt; type powershell_ise (note the underscore) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The ISE interface is made up of the following:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Script/Editor pane – this is where you will spend most of your time creating scripts. Tabs across the top of the pane allow you to work on multiple scripts at the same time. &lt;/li&gt;    &lt;li&gt;Output pane – this is where the output from executing your script is displayed. &lt;/li&gt;    &lt;li&gt;Command pane – you can enter ad-hoc commands in this pane. It effectively behaves as a standard PowerShell Command Shell &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;This type of interface is a bit more familiar to those who are used to Visual Studio, although perhaps a little basic in direct comparison:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;You have a text area where you can enter your script &lt;/li&gt;    &lt;li&gt;Your have toolbar buttons to control script execution &lt;/li&gt;    &lt;li&gt;You have basic debugging facilities. &lt;/li&gt;    &lt;li&gt;Useful context sensitive help – highlight a command in the script window and press F1 &lt;/li&gt;    &lt;li&gt;Execute part of the scripts without running the whole thing (highlight the text you want to run and choose “Run Selection” &lt;/li&gt;    &lt;li&gt;You can customise the environment by changing $psISE.Options including adding new menu options. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The first time I attempt to debug a script in the ISE – I couldn’t figure out how to set a breakpoint. Coming from a Visual Studio background – I am used to creating a breakpoint whenever and where-ever I like. However – the ISE refused to create my breakpoint. I eventually figured out that you simply need to save your script and you then get access to the debugging facilities. You also need to remember that breakpoints are only remembered for your session – once you close the ISE and fire it up again – you’ve lost all your previous breakpoints.&lt;/p&gt;  &lt;p&gt;At this stage, its also worthwhile mentioning that &lt;a href="http://www.quest.com/powershell/" target="_blank"&gt;Quest&lt;/a&gt; provides a free graphical user interface and script editor for Windows PowerShell called &lt;a href="http://www.powergui.org" target="_blank"&gt;PowerGUI&lt;/a&gt;. This is definitely worth a look if you are going to be doing a lot with PowerShell.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/archive/2010/05/11/windows-powershell-series-part-6-getting-to-grips-with-scripts.aspx"&gt;Next step&lt;/a&gt; – Getting to grips with scripts&lt;/p&gt;  &lt;p&gt;&lt;a title="Previous Step" href="http://blogs.charteris.com/blogs/ivorb/archive/2010/05/05/windows-powershell-series-part-4-customise-via-commands.aspx"&gt;Previous step&lt;/a&gt; – Customise via Commands&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:76ae3190-c0bd-424f-a2f6-838ab629d312" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/PowerShell" rel="tag"&gt;PowerShell&lt;/a&gt;&lt;/div&gt;
&lt;div id="SocialBookmarks"&gt;&lt;a href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f05%2f10%2fwindows-powershell-series-part-5-the-integrated-shell-environment-ise.aspx&amp;tags=&amp;title=Windows+PowerShell+Series+-+Part+5+%e2%80%93+The+Integrated+Shell+Environment+(ISE)" mce_href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f05%2f10%2fwindows-powershell-series-part-5-the-integrated-shell-environment-ise.aspx&amp;tags=&amp;title=Windows+PowerShell+Series+-+Part+5+%e2%80%93+The+Integrated+Shell+Environment+(ISE)"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/delicious.gif"&gt;Del.icio.us&amp;nbsp;&lt;/a&gt;&lt;a href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f05%2f10%2fwindows-powershell-series-part-5-the-integrated-shell-environment-ise.aspx&amp;title=Windows+PowerShell+Series+-+Part+5+%e2%80%93+The+Integrated+Shell+Environment+(ISE)&amp;tags=" mce_href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f05%2f10%2fwindows-powershell-series-part-5-the-integrated-shell-environment-ise.aspx&amp;title=Windows+PowerShell+Series+-+Part+5+%e2%80%93+The+Integrated+Shell+Environment+(ISE)&amp;tags="&gt;&lt;img border="0" src="/Themes/leanandgreen/images/digg.gif"&gt;Digg It&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f05%2f10%2fwindows-powershell-series-part-5-the-integrated-shell-environment-ise.aspx" mce_href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f05%2f10%2fwindows-powershell-series-part-5-the-integrated-shell-environment-ise.aspx"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/facebook.gif"&gt;Share on Facebook&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f05%2f10%2fwindows-powershell-series-part-5-the-integrated-shell-environment-ise.aspx&amp;title=Windows+PowerShell+Series+-+Part+5+%e2%80%93+The+Integrated+Shell+Environment+(ISE)" mce_href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f05%2f10%2fwindows-powershell-series-part-5-the-integrated-shell-environment-ise.aspx&amp;title=Windows+PowerShell+Series+-+Part+5+%e2%80%93+The+Integrated+Shell+Environment+(ISE)"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/stumble.gif"&gt;Stumble It!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.charteris.com/aggbug.aspx?PostID=962" width="1" height="1"&gt;</description><category domain="http://blogs.charteris.com/blogs/ivorb/archive/tags/PowerShell/default.aspx">PowerShell</category></item><item><title>Windows PowerShell Series - Part 4 – Customise via Commands</title><link>http://blogs.charteris.com/blogs/ivorb/archive/2010/05/05/windows-powershell-series-part-4-customise-via-commands.aspx</link><pubDate>Wed, 05 May 2010 10:48:22 GMT</pubDate><guid isPermaLink="false">0cdfd867-77e4-483c-9e74-84c93cc8eba0:957</guid><dc:creator>IvorB</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;This is part 4 in a series of posts related to Windows PowerShell, and deals with customising the PowerShell console through use of PowerShell commands.&lt;/p&gt;  &lt;p&gt;We’re seen previously how you can Customise the appearance of the PowerShell command by tweaking the properties of the console. However, you can also issue PowerShell commands which affect the appearance of the console.&lt;/p&gt;  &lt;p&gt;The command Get-Host gives you a reference to ConsoleHost object. This has a UI property which manages a lot of the UI details for the console, and this in turn has a RawUI property which gives access to colour, title etc. e.g. (Get-Host).UI.RawUI gives the following:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/GetHost_0A200006.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Get-Host" border="0" alt="Get-Host" src="http://blogs.charteris.com/blogs/ivorb/GetHost_thumb_110F8CBE.jpg" width="644" height="296" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;We use brackets around Get-Host to ensure this is evaluated first, before we access the UI property of the return object.&lt;/p&gt;  &lt;p&gt;If you want to save a bit of typing, you can use $Host.UI.RawUI to return the same information. $Host is a special variable that is a reference to the current console object.&lt;/p&gt;  &lt;p&gt;The property values can be changed, so you can do something like the following to get a console that looks like a standard command console:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/CommandPrompt_2FD5DACF.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="CommandPrompt" border="0" alt="CommandPrompt" src="http://blogs.charteris.com/blogs/ivorb/CommandPrompt_thumb_3CCFBAE0.jpg" width="644" height="86" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;If you change some of the properties like background-color, you might want to use the command Clear-Host to “refresh” the entire console window.&lt;/p&gt;  &lt;p&gt;Changing the Window Size or Position is slightly more complicated as these are “complex” objects rather than simple properties. The easiest way to change these types of properties is to store the current value in a variable, and then adjust property values on the variable. e.g:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/WindowSize_66CFB908.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="WindowSize" border="0" alt="WindowSize" src="http://blogs.charteris.com/blogs/ivorb/WindowSize_thumb_3D78710A.jpg" width="644" height="179" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Here we store the current WindowSize in a variable called $WindowSize, adjust its Width property and then set the WindowSize back to the Console.&lt;/p&gt;  &lt;p&gt;It would be quite tedious if you had to issue the same commands to setup your Console environment every time you wanted to use PowerShell, so the solution is to adjust your profile. You can find out where your current/active profile is stored by viewing the special variable $profile. You should find that your default profile is stored in a file called something like Microsoft.PowerShell_profile.ps1. You can now put whatever commands you like in this file (by using Notepad or similar) and these commands will be executed every time you start a PowerShell console. If the folder or file don’t already exist – just create them and everything should just work fine.&lt;/p&gt;  &lt;p&gt;You might find that the first time you try this, that you get an error like “Microsoft.PowerShell_profile.ps1 is not digitally signed”. This is deliberate by Microsoft to prevent scripts executing without your permission. We’ll discuss signing of scripts and execution policies in a later article, but for the moment – the fastest&amp;#160; (and laziest) way to get this to work is to change PowerShell to allow execution of local scripts which are unsigned. You can do this by issuing the following PowerShell command: &lt;/p&gt;  &lt;p&gt;Set-ExecutionPolicy RemoteSigned&lt;/p&gt;  &lt;p&gt;You can find loads of information about customising the PowerShell console at the following location: &lt;a title="Technet article for Customise the PowerShell console" href="http://technet.microsoft.com/en-us/library/ee156814.aspx"&gt;Customise the PowerShell Console&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/archive/2010/05/10/windows-powershell-series-part-5-the-integrated-shell-environment-ise.aspx"&gt;Next step&lt;/a&gt; – The Integrated Shell Environment (ISE)&lt;/p&gt;  &lt;p&gt;&lt;a title="Previous Step" href="http://blogs.charteris.com/blogs/ivorb/archive/2010/05/04/windows-powershell-series-part-3-customise-the-console.aspx"&gt;Previous step&lt;/a&gt; – Customise the Console&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:80cd9902-61ef-402f-a608-b8133e24a673" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/PowerShell" rel="tag"&gt;PowerShell&lt;/a&gt;&lt;/div&gt;
&lt;div id="SocialBookmarks"&gt;&lt;a href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f05%2f05%2fwindows-powershell-series-part-4-customise-via-commands.aspx&amp;tags=&amp;title=Windows+PowerShell+Series+-+Part+4+%e2%80%93+Customise+via+Commands" mce_href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f05%2f05%2fwindows-powershell-series-part-4-customise-via-commands.aspx&amp;tags=&amp;title=Windows+PowerShell+Series+-+Part+4+%e2%80%93+Customise+via+Commands"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/delicious.gif"&gt;Del.icio.us&amp;nbsp;&lt;/a&gt;&lt;a href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f05%2f05%2fwindows-powershell-series-part-4-customise-via-commands.aspx&amp;title=Windows+PowerShell+Series+-+Part+4+%e2%80%93+Customise+via+Commands&amp;tags=" mce_href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f05%2f05%2fwindows-powershell-series-part-4-customise-via-commands.aspx&amp;title=Windows+PowerShell+Series+-+Part+4+%e2%80%93+Customise+via+Commands&amp;tags="&gt;&lt;img border="0" src="/Themes/leanandgreen/images/digg.gif"&gt;Digg It&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f05%2f05%2fwindows-powershell-series-part-4-customise-via-commands.aspx" mce_href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f05%2f05%2fwindows-powershell-series-part-4-customise-via-commands.aspx"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/facebook.gif"&gt;Share on Facebook&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f05%2f05%2fwindows-powershell-series-part-4-customise-via-commands.aspx&amp;title=Windows+PowerShell+Series+-+Part+4+%e2%80%93+Customise+via+Commands" mce_href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f05%2f05%2fwindows-powershell-series-part-4-customise-via-commands.aspx&amp;title=Windows+PowerShell+Series+-+Part+4+%e2%80%93+Customise+via+Commands"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/stumble.gif"&gt;Stumble It!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.charteris.com/aggbug.aspx?PostID=957" width="1" height="1"&gt;</description><category domain="http://blogs.charteris.com/blogs/ivorb/archive/tags/PowerShell/default.aspx">PowerShell</category></item><item><title>Mobile Technologies To Watch In 2010 &amp; 2011</title><link>http://blogs.charteris.com/blogs/rogerw/archive/2010/05/05/mobile-technologies-to-watch-in-2010-amp-2011.aspx</link><pubDate>Wed, 05 May 2010 10:44:00 GMT</pubDate><guid isPermaLink="false">0cdfd867-77e4-483c-9e74-84c93cc8eba0:956</guid><dc:creator>rogerw</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;I caught site of this useful Gartner article on mobile technologies to watch out for in 2010 and 2011. Rather than repeat it all in this blog I’ll just give you the link at: &lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.gartner.com/it/page.jsp?id=1328113"&gt;http://www.gartner.com/it/page.jsp?id=1328113&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The comments around widgets, AppStores focussed equally on B2E and B2C channels,&amp;nbsp; and the mobile web, all look interesting from a development perspective. Mobile technologies (particular mobile web) have been an elusive “next big thing” for a while,&amp;nbsp; so the realising all of the promise is key. Much of this will come down to ability to&amp;nbsp;package the technology into usable and universal formats.&lt;/p&gt;
&lt;p&gt;Many of the technologies listed are evolutions of what is already out there in the market place.&amp;nbsp;Perhaps with the publicity hype and profile created by the IPad and the promised ubiquity of this technology in all devices (not just the high end ones), the reality may be a shorter step away.&amp;nbsp; &lt;/p&gt;
&lt;div id="SocialBookmarks"&gt;&lt;a href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2frogerw%2farchive%2f2010%2f05%2f05%2fmobile-technologies-to-watch-in-2010-amp-2011.aspx&amp;tags=&amp;title=Mobile+Technologies+To+Watch+In+2010+%26amp%3b+2011" mce_href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2frogerw%2farchive%2f2010%2f05%2f05%2fmobile-technologies-to-watch-in-2010-amp-2011.aspx&amp;tags=&amp;title=Mobile+Technologies+To+Watch+In+2010+%26amp%3b+2011"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/delicious.gif"&gt;Del.icio.us&amp;nbsp;&lt;/a&gt;&lt;a href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2frogerw%2farchive%2f2010%2f05%2f05%2fmobile-technologies-to-watch-in-2010-amp-2011.aspx&amp;title=Mobile+Technologies+To+Watch+In+2010+%26amp%3b+2011&amp;tags=" mce_href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2frogerw%2farchive%2f2010%2f05%2f05%2fmobile-technologies-to-watch-in-2010-amp-2011.aspx&amp;title=Mobile+Technologies+To+Watch+In+2010+%26amp%3b+2011&amp;tags="&gt;&lt;img border="0" src="/Themes/leanandgreen/images/digg.gif"&gt;Digg It&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2frogerw%2farchive%2f2010%2f05%2f05%2fmobile-technologies-to-watch-in-2010-amp-2011.aspx" mce_href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2frogerw%2farchive%2f2010%2f05%2f05%2fmobile-technologies-to-watch-in-2010-amp-2011.aspx"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/facebook.gif"&gt;Share on Facebook&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2frogerw%2farchive%2f2010%2f05%2f05%2fmobile-technologies-to-watch-in-2010-amp-2011.aspx&amp;title=Mobile+Technologies+To+Watch+In+2010+%26amp%3b+2011" mce_href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2frogerw%2farchive%2f2010%2f05%2f05%2fmobile-technologies-to-watch-in-2010-amp-2011.aspx&amp;title=Mobile+Technologies+To+Watch+In+2010+%26amp%3b+2011"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/stumble.gif"&gt;Stumble It!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.charteris.com/aggbug.aspx?PostID=956" width="1" height="1"&gt;</description><category domain="http://blogs.charteris.com/blogs/rogerw/archive/tags/Mobile+Devices/default.aspx">Mobile Devices</category><category domain="http://blogs.charteris.com/blogs/rogerw/archive/tags/Mobile+Trends/default.aspx">Mobile Trends</category></item><item><title>Windows PowerShell Series - Part 3 – Customise the Console</title><link>http://blogs.charteris.com/blogs/ivorb/archive/2010/05/04/windows-powershell-series-part-3-customise-the-console.aspx</link><pubDate>Tue, 04 May 2010 16:08:20 GMT</pubDate><guid isPermaLink="false">0cdfd867-77e4-483c-9e74-84c93cc8eba0:950</guid><dc:creator>IvorB</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;This is part 3 in a series of posts related to Windows PowerShell, and deals with customising the PowerShell console.&lt;/p&gt;  &lt;p&gt;If you use the PowerShell console frequently, it is probably worth spending a bit of time to customise it to your exact tastes. You are going to be looking at the console quite a bit, so you may as well have it exactly the way you want it!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/Properties_528FEBFC.jpg"&gt;&lt;img style="border-right-width:0px;margin:6px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Properties" border="0" alt="Properties" align="right" src="http://blogs.charteris.com/blogs/ivorb/Properties_thumb_44DD2FF4.jpg" width="244" height="145" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;To begin customising your console, fire up the PowerShell console and right click the title bar and choose properties. From the properties menu, you then have the choice of 4 tabs:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Options &lt;/li&gt;    &lt;li&gt;Font &lt;/li&gt;    &lt;li&gt;Layout &lt;/li&gt;    &lt;li&gt;Colours &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Options&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Cursor Size: Fairly obvious – I find the default of “small” fine for normal use. &lt;/li&gt;    &lt;li&gt;Command History: The command history is a buffer of previous commands in the current session. You can access previous commands in the session by using the arrow keys (up and down and press Enter to choose a particular command),&amp;#160; press F7 to display a pop up window that contains the list of buffered commands or type the first few letters of the command to execute and press F8. &lt;/li&gt;    &lt;li&gt;Edit Options: QuickEdit mode allows you to single mouse click to paste into the command window (rather than right clicking and choosing paste). InsertMode means that you default to inserting a new command and clearing this option means that you overwrite text as the default editing mode. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Font&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Allows you to adjust the font used in the console window. I personally increate the font size to “12 x 16” which I find easier on the eye. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Layout&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Screen Buffer Size: This controls the virtual window size which is the amount of content the window can actually hold. If the virtual window size is larger than the actual window size, then the console window changes to include scrollbars. &lt;/li&gt;    &lt;li&gt;Window Size: The size of the physical window. You should probably make the width the same as the screen buffer size width to avoid horizontal scroll bars. &lt;/li&gt;    &lt;li&gt;Window Position: Uncheck Let system position window if you want to control the initial position of the window. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Colours&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Allows you to set the foreground and background colours used by the PowerShell console. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Click OK to save your settings to your user profile. Note: You may need to run PowerShell as Administrator in order for your settings to be saved. It is also worth noting that your changes are only applicable to the shortcut that you used to start PowerShell.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/archive/2010/05/05/windows-powershell-series-part-4-customise-via-commands.aspx"&gt;Next step&lt;/a&gt; – Customise via Commands&lt;/p&gt;  &lt;p&gt;&lt;a title="Previous Step" href="http://blogs.charteris.com/blogs/ivorb/archive/2010/04/30/windows-powershell-series-part-2-installation.aspx"&gt;Previous step&lt;/a&gt; – Installation&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:dc2d5069-ddb5-4c0f-874d-e84f3ca12c86" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/PowerShell" rel="tag"&gt;PowerShell&lt;/a&gt;&lt;/div&gt;
&lt;div id="SocialBookmarks"&gt;&lt;a href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f05%2f04%2fwindows-powershell-series-part-3-customise-the-console.aspx&amp;tags=&amp;title=Windows+PowerShell+Series+-+Part+3+%e2%80%93+Customise+the+Console" mce_href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f05%2f04%2fwindows-powershell-series-part-3-customise-the-console.aspx&amp;tags=&amp;title=Windows+PowerShell+Series+-+Part+3+%e2%80%93+Customise+the+Console"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/delicious.gif"&gt;Del.icio.us&amp;nbsp;&lt;/a&gt;&lt;a href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f05%2f04%2fwindows-powershell-series-part-3-customise-the-console.aspx&amp;title=Windows+PowerShell+Series+-+Part+3+%e2%80%93+Customise+the+Console&amp;tags=" mce_href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f05%2f04%2fwindows-powershell-series-part-3-customise-the-console.aspx&amp;title=Windows+PowerShell+Series+-+Part+3+%e2%80%93+Customise+the+Console&amp;tags="&gt;&lt;img border="0" src="/Themes/leanandgreen/images/digg.gif"&gt;Digg It&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f05%2f04%2fwindows-powershell-series-part-3-customise-the-console.aspx" mce_href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f05%2f04%2fwindows-powershell-series-part-3-customise-the-console.aspx"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/facebook.gif"&gt;Share on Facebook&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f05%2f04%2fwindows-powershell-series-part-3-customise-the-console.aspx&amp;title=Windows+PowerShell+Series+-+Part+3+%e2%80%93+Customise+the+Console" mce_href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f05%2f04%2fwindows-powershell-series-part-3-customise-the-console.aspx&amp;title=Windows+PowerShell+Series+-+Part+3+%e2%80%93+Customise+the+Console"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/stumble.gif"&gt;Stumble It!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.charteris.com/aggbug.aspx?PostID=950" width="1" height="1"&gt;</description><category domain="http://blogs.charteris.com/blogs/ivorb/archive/tags/PowerShell/default.aspx">PowerShell</category></item><item><title>Windows PowerShell Series - Part 2 - Installation</title><link>http://blogs.charteris.com/blogs/ivorb/archive/2010/04/30/windows-powershell-series-part-2-installation.aspx</link><pubDate>Fri, 30 Apr 2010 11:07:00 GMT</pubDate><guid isPermaLink="false">0cdfd867-77e4-483c-9e74-84c93cc8eba0:942</guid><dc:creator>IvorB</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;This is part 2 in a series of posts related to Windows PowerShell, and deals with Installation&lt;/p&gt;  &lt;p&gt;The good news if you are running Windows 7 or Windows Server 2008 R2 (or later) is that you have nothing to do – PowerShell V2 was installed as part of the operating system.&lt;/p&gt;  &lt;p&gt;If you have a different operating system and want to install PowerShell – you have to choose between PowerShell V1 and PowerShell V2. The only reason I can think of to choose PowerShell V1 is if you were working as part of a team where everyone is using that version. If possible – just go for PowerShell V2 as it includes a vast number of additional commands.&lt;/p&gt;  &lt;p&gt;PowerShell is installed as part of Windows Management Framework so visit &lt;a title="Microsoft Support" href="http://support.microsoft.com/kb/968929" target="_blank"&gt;Microsoft Support&lt;/a&gt; for install packages for a number of different platforms.&lt;/p&gt;  &lt;p&gt;Once PowerShell is on your system, fire it up by any of the following methods:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;All Programs &amp;gt; Accessories &amp;gt; Windows PowerShell &amp;gt; Windows PowerShell V2 &lt;/li&gt;    &lt;li&gt;From a command line prompt (e.g. cmd), type powershell &lt;/li&gt;    &lt;li&gt;Start menu &amp;gt; Search &amp;gt; type powershell &lt;/li&gt;    &lt;li&gt;[Win] + R (for Run command) &amp;gt; type powershell &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Whatever method you try, the result should be the same – the PowerShell command prompt which should look like:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/PowerShellConsole_041EEAB0.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="PowerShellConsole" border="0" alt="PowerShellConsole" src="http://blogs.charteris.com/blogs/ivorb/PowerShellConsole_thumb_4CA8B3B4.jpg" width="653" height="181" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Once you’ve got the PowerShell console open – let’s confirm that you have V2 installed by typing the following command:&lt;/p&gt;  &lt;p&gt;get-host&lt;/p&gt;  &lt;p&gt;You should see something like the following:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/PowerShellVersion_2429D1A0.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="PowerShellVersion" border="0" alt="PowerShellVersion" src="http://blogs.charteris.com/blogs/ivorb/PowerShellVersion_thumb_48DAE917.jpg" width="669" height="215" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Assuming you have got the same – then we are good to go.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.charteris.com/blogs/ivorb/archive/2010/05/04/windows-powershell-series-part-3-customise-the-console.aspx"&gt;Next step&lt;/a&gt; – Customise the Console&lt;/p&gt;  &lt;p&gt;&lt;a title="Previous Step" href="http://blogs.charteris.com/blogs/ivorb/archive/2010/04/29/windows-powershell-series-part-1-introduction.aspx"&gt;Previous step&lt;/a&gt; – Introduction&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:ecde7f31-2742-40fe-af11-7a2daef5d218" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/PowerShell" rel="tag"&gt;PowerShell&lt;/a&gt;&lt;/div&gt;
&lt;div id="SocialBookmarks"&gt;&lt;a href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f04%2f30%2fwindows-powershell-series-part-2-installation.aspx&amp;tags=&amp;title=Windows+PowerShell+Series+-+Part+2+-+Installation" mce_href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f04%2f30%2fwindows-powershell-series-part-2-installation.aspx&amp;tags=&amp;title=Windows+PowerShell+Series+-+Part+2+-+Installation"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/delicious.gif"&gt;Del.icio.us&amp;nbsp;&lt;/a&gt;&lt;a href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f04%2f30%2fwindows-powershell-series-part-2-installation.aspx&amp;title=Windows+PowerShell+Series+-+Part+2+-+Installation&amp;tags=" mce_href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f04%2f30%2fwindows-powershell-series-part-2-installation.aspx&amp;title=Windows+PowerShell+Series+-+Part+2+-+Installation&amp;tags="&gt;&lt;img border="0" src="/Themes/leanandgreen/images/digg.gif"&gt;Digg It&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f04%2f30%2fwindows-powershell-series-part-2-installation.aspx" mce_href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f04%2f30%2fwindows-powershell-series-part-2-installation.aspx"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/facebook.gif"&gt;Share on Facebook&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f04%2f30%2fwindows-powershell-series-part-2-installation.aspx&amp;title=Windows+PowerShell+Series+-+Part+2+-+Installation" mce_href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f04%2f30%2fwindows-powershell-series-part-2-installation.aspx&amp;title=Windows+PowerShell+Series+-+Part+2+-+Installation"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/stumble.gif"&gt;Stumble It!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.charteris.com/aggbug.aspx?PostID=942" width="1" height="1"&gt;</description><category domain="http://blogs.charteris.com/blogs/ivorb/archive/tags/PowerShell/default.aspx">PowerShell</category></item><item><title>Windows PowerShell Series - Part 1 - Introduction</title><link>http://blogs.charteris.com/blogs/ivorb/archive/2010/04/29/windows-powershell-series-part-1-introduction.aspx</link><pubDate>Thu, 29 Apr 2010 16:38:00 GMT</pubDate><guid isPermaLink="false">0cdfd867-77e4-483c-9e74-84c93cc8eba0:941</guid><dc:creator>IvorB</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;&lt;a title="Windows PowerShell" href="http://www.microsoft.com/PowerShell" target="_blank"&gt;&lt;img style="BORDER-RIGHT-WIDTH:0px;MARGIN:10px 10px 10px 0px;DISPLAY:inline;BORDER-TOP-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-LEFT-WIDTH:0px;" title="powershell" border="0" alt="powershell" align="left" src="http://blogs.charteris.com/blogs/ivorb/powershell_2DD82087.jpg" width="204" height="152" /&gt;&lt;/a&gt;This is the start of a number of posts related to Windows PowerShell. The goal is that each post will introduce a single concept, and build upon previous posts in the series. We’re going to start off with a very gentle introduction which will hopefully explain “What is Windows PowerShell?” &lt;/p&gt;
&lt;p&gt;Windows PowerShell is the latest command line shell and scripting language from Microsoft. An initial reaction might be “Do we really need another shell?” and my answer is that you should give it a go. If you like it – use it. If you don’t like it – then chances are you will be able to achieve whatever you need to do some other way. What PowerShell does really well is bring together a large number of commands, make their usage consistent and makes it really easy for you to build your own powerful scripts.&lt;/p&gt;
&lt;p&gt;PowerShell implements a scripting language based upon C# and an object model based upon Microsoft .NET framework. As such – it is incredibly easy for someone with a developer background to pick it up. However – System Administrators will also love the fact that they will be able to use PowerShell to manage Active Directory, Exchange, Windows File System, Windows Services and a wide variety of other essential system infrastructure components.&lt;/p&gt;
&lt;p&gt;This series will attempt to cover as many aspects of PowerShell as possible, but feel free to make suggestions for content to cover. &lt;/p&gt;
&lt;p&gt;&lt;a title="Next step" href="http://blogs.charteris.com/blogs/ivorb/archive/2010/04/30/windows-powershell-series-part-2-installation.aspx"&gt;Next step&lt;/a&gt; – Installing PowerShell…&lt;/p&gt;
&lt;div style="PADDING-BOTTOM:0px;MARGIN:0px;PADDING-LEFT:0px;PADDING-RIGHT:0px;DISPLAY:inline;FLOAT:none;PADDING-TOP:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:84c665f4-c5bc-4332-9a88-4f5f8c7d162c" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/PowerShell" rel="tag"&gt;PowerShell&lt;/a&gt;&lt;/div&gt;
&lt;div id="SocialBookmarks"&gt;&lt;a href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f04%2f29%2fwindows-powershell-series-part-1-introduction.aspx&amp;tags=&amp;title=Windows+PowerShell+Series+-+Part+1+-+Introduction" mce_href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f04%2f29%2fwindows-powershell-series-part-1-introduction.aspx&amp;tags=&amp;title=Windows+PowerShell+Series+-+Part+1+-+Introduction"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/delicious.gif"&gt;Del.icio.us&amp;nbsp;&lt;/a&gt;&lt;a href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f04%2f29%2fwindows-powershell-series-part-1-introduction.aspx&amp;title=Windows+PowerShell+Series+-+Part+1+-+Introduction&amp;tags=" mce_href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f04%2f29%2fwindows-powershell-series-part-1-introduction.aspx&amp;title=Windows+PowerShell+Series+-+Part+1+-+Introduction&amp;tags="&gt;&lt;img border="0" src="/Themes/leanandgreen/images/digg.gif"&gt;Digg It&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f04%2f29%2fwindows-powershell-series-part-1-introduction.aspx" mce_href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f04%2f29%2fwindows-powershell-series-part-1-introduction.aspx"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/facebook.gif"&gt;Share on Facebook&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f04%2f29%2fwindows-powershell-series-part-1-introduction.aspx&amp;title=Windows+PowerShell+Series+-+Part+1+-+Introduction" mce_href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fivorb%2farchive%2f2010%2f04%2f29%2fwindows-powershell-series-part-1-introduction.aspx&amp;title=Windows+PowerShell+Series+-+Part+1+-+Introduction"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/stumble.gif"&gt;Stumble It!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.charteris.com/aggbug.aspx?PostID=941" width="1" height="1"&gt;</description><category domain="http://blogs.charteris.com/blogs/ivorb/archive/tags/PowerShell/default.aspx">PowerShell</category></item><item><title>Getting Ahead - Windows Phone 7 Series Developer Training Kit Announced</title><link>http://blogs.charteris.com/blogs/rogerw/archive/2010/04/23/getting-ahead-windows-phone-7-series-developer-training-kit-announced.aspx</link><pubDate>Fri, 23 Apr 2010 08:10:00 GMT</pubDate><guid isPermaLink="false">0cdfd867-77e4-483c-9e74-84c93cc8eba0:939</guid><dc:creator>rogerw</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;For those of you itching to get ahead with Windows Phone 7 Series development, Microsoft have just announced a Windows Phone 7 Series Developer Training Kit. This is aimed at beginners onwards and caters for all the new technologies announced in Windows Phone 7 Series, including XNA, Silverlight etc. You don’t need to be an expert in these technologies to benefit, you just need a knowledge of Visual Studio and Microsoft .NET Framework. &lt;/p&gt;
&lt;p&gt;The following course units are covered: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Getting Started with Windows Phone&lt;/li&gt;
&lt;li&gt;Silverlight for Windows Phone&lt;/li&gt;
&lt;li&gt;XNA Framework 4.0 for Windows Phones&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;I am part way through the first unit at time of writing.&lt;/p&gt;
&lt;p&gt;Windows Phone 7 promises to be an interesting release and there is a lot riding on it for Microsoft. As XNA is one of the technologies underlying the Xbox 360 Gaming console it promises to be particularly interesting in that arena. &lt;/p&gt;
&lt;p&gt;If you want to find out more about the kit and download it, you can do so at: &lt;/p&gt;
&lt;p&gt;&lt;a title="http://channel9.msdn.com/learn/courses/WP7TrainingKit/" href="http://channel9.msdn.com/learn/courses/WP7TrainingKit/"&gt;http://channel9.msdn.com/learn/courses/WP7TrainingKit/&lt;/a&gt;&lt;/p&gt;
&lt;div id="SocialBookmarks"&gt;&lt;a href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2frogerw%2farchive%2f2010%2f04%2f23%2fgetting-ahead-windows-phone-7-series-developer-training-kit-announced.aspx&amp;tags=&amp;title=Getting+Ahead+-+Windows+Phone+7+Series+Developer+Training+Kit+Announced" mce_href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2frogerw%2farchive%2f2010%2f04%2f23%2fgetting-ahead-windows-phone-7-series-developer-training-kit-announced.aspx&amp;tags=&amp;title=Getting+Ahead+-+Windows+Phone+7+Series+Developer+Training+Kit+Announced"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/delicious.gif"&gt;Del.icio.us&amp;nbsp;&lt;/a&gt;&lt;a href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2frogerw%2farchive%2f2010%2f04%2f23%2fgetting-ahead-windows-phone-7-series-developer-training-kit-announced.aspx&amp;title=Getting+Ahead+-+Windows+Phone+7+Series+Developer+Training+Kit+Announced&amp;tags=" mce_href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2frogerw%2farchive%2f2010%2f04%2f23%2fgetting-ahead-windows-phone-7-series-developer-training-kit-announced.aspx&amp;title=Getting+Ahead+-+Windows+Phone+7+Series+Developer+Training+Kit+Announced&amp;tags="&gt;&lt;img border="0" src="/Themes/leanandgreen/images/digg.gif"&gt;Digg It&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2frogerw%2farchive%2f2010%2f04%2f23%2fgetting-ahead-windows-phone-7-series-developer-training-kit-announced.aspx" mce_href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2frogerw%2farchive%2f2010%2f04%2f23%2fgetting-ahead-windows-phone-7-series-developer-training-kit-announced.aspx"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/facebook.gif"&gt;Share on Facebook&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2frogerw%2farchive%2f2010%2f04%2f23%2fgetting-ahead-windows-phone-7-series-developer-training-kit-announced.aspx&amp;title=Getting+Ahead+-+Windows+Phone+7+Series+Developer+Training+Kit+Announced" mce_href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2frogerw%2farchive%2f2010%2f04%2f23%2fgetting-ahead-windows-phone-7-series-developer-training-kit-announced.aspx&amp;title=Getting+Ahead+-+Windows+Phone+7+Series+Developer+Training+Kit+Announced"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/stumble.gif"&gt;Stumble It!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.charteris.com/aggbug.aspx?PostID=939" width="1" height="1"&gt;</description><category domain="http://blogs.charteris.com/blogs/rogerw/archive/tags/Mobile+Devices/default.aspx">Mobile Devices</category><category domain="http://blogs.charteris.com/blogs/rogerw/archive/tags/Windows+Mobile+Compatibility/default.aspx">Windows Mobile Compatibility</category><category domain="http://blogs.charteris.com/blogs/rogerw/archive/tags/XNA+Framework+4.0/default.aspx">XNA Framework 4.0</category><category domain="http://blogs.charteris.com/blogs/rogerw/archive/tags/Windows+Phone+Series+7/default.aspx">Windows Phone Series 7</category></item><item><title>The SharePoint Ironman</title><link>http://blogs.charteris.com/blogs/colinn/archive/2010/04/21/the-sharepoint-ironman.aspx</link><pubDate>Wed, 21 Apr 2010 13:11:47 GMT</pubDate><guid isPermaLink="false">0cdfd867-77e4-483c-9e74-84c93cc8eba0:938</guid><dc:creator>colinn</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Nope no Robert Downey Jnr in this one you’ll have to wait until April 30th for that (in the UK at least). This was Mike Watson (a man who used to play with tanks on a professional basis) taking the SharePoint Evolution attendees through the major enhancements to SharePoint which will make high availability solutions a little easier to architect and deploy.&lt;/p&gt;  &lt;p&gt;Mike started with a rundown of the major issues with SharePoint 2007:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Granular Recovery – ah that look on a client’s face when you tell them just exactly what&amp;#160; they will have to go through now that 1k text document they deleted has exited the recycle bin (cue exasperated sighs stage left). Just a simple matter of recovering that backed up database to a web app and then finding the document concerned – a doddle &lt;/li&gt;    &lt;li&gt;Disaster Recovery – a small list of laundry for this one that can only truly be satisfied by a sub list:      &lt;ul&gt;       &lt;li&gt;No native support for mirroring – let’s do the swap over by hand or rely on some cludgy scripts &lt;/li&gt;        &lt;li&gt;Everything can be made redundant, apart from that indexy bit and if that goes and you’re reliant on search apps? Just how many documents do you have to crawl? You weren’t planning on doing anything over the next couple of days/weeks/months were you? &lt;/li&gt;        &lt;li&gt;Robust backup – let’s back up everything. Yip content, config… you want to restore config? Ok but that’s you unsupported as far as Microsoft is concerned. They didn’t mention that? &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Ok various vendors have spent millions and made millions producing tools to sort these issues out. But does SharePoint 2010 handle them in anyway?&lt;/p&gt;  &lt;p&gt;Mike Watson seems to believe… sometimes. Here is what I gleaned concerning these issues.&lt;/p&gt;  &lt;p&gt;Granular Recovery – well the good news is you won’t have to restore the content DB backup to a SharePoint Farm, Hidden in the depths of 2010 Central Administration is a command called &lt;strong&gt;Granular Recovery from unattached database&lt;/strong&gt;. And backup now goes down to the list level. Certainly an improvement but I doubt the likes of Quest and AvePoint will be packing up their tools and leaving the SharePoint scene anytime soon. Anybody who has used one of these tools to search and retrieve an item from a backup file (no restoring to SQL) will know why.&lt;/p&gt;  &lt;p&gt;Native support for mirroring – Now you can tell your SharePoint sites where the failover database is. If SharePoint cannot contact the principal node (I think it’s in 10 seconds) then it will attempt to contact the failover. This in my humble (well not so I am blogging after all) is brilliant. Unfortunately you still need to set up the SQL side from SQL but when combined with a witness server this could be a very useful addition.&lt;/p&gt;  &lt;p&gt;Index Server – this is now the &lt;strong&gt;Crawl Server&lt;/strong&gt;, I know you just get used to one set of names and acronyms and then they change (wait until you find out about BDC, still a SharePointy acronym but doesn’t quite mean what it used to). Anyway, with the brand new service architecture the single point of failure is gone in 2010. It’ll even support mirroring if you really want to (more redundancy and you know what redundancy makes? Yep license sales).&lt;/p&gt;  &lt;p&gt;Robust backup – the reason&amp;#160; Microsoft didn’t support mirroring and restore for the config database in 2007 was the sheer volatility of the data. In 2010 they do support backup and restore. The config backup saves settings to an XML file which could even be restored to a completely separate farm, in theory. Mr Watson was quick to point out that he hadn’t seen it done.&lt;/p&gt;  &lt;p&gt;So some great improvements, especially around redundancy and mirroring. Should make complying to those SLAs a little easier.&lt;/p&gt;
&lt;div id="SocialBookmarks"&gt;&lt;a href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f21%2fthe-sharepoint-ironman.aspx&amp;tags=&amp;title=The+SharePoint+Ironman" mce_href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f21%2fthe-sharepoint-ironman.aspx&amp;tags=&amp;title=The+SharePoint+Ironman"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/delicious.gif"&gt;Del.icio.us&amp;nbsp;&lt;/a&gt;&lt;a href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f21%2fthe-sharepoint-ironman.aspx&amp;title=The+SharePoint+Ironman&amp;tags=" mce_href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f21%2fthe-sharepoint-ironman.aspx&amp;title=The+SharePoint+Ironman&amp;tags="&gt;&lt;img border="0" src="/Themes/leanandgreen/images/digg.gif"&gt;Digg It&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f21%2fthe-sharepoint-ironman.aspx" mce_href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f21%2fthe-sharepoint-ironman.aspx"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/facebook.gif"&gt;Share on Facebook&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f21%2fthe-sharepoint-ironman.aspx&amp;title=The+SharePoint+Ironman" mce_href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f21%2fthe-sharepoint-ironman.aspx&amp;title=The+SharePoint+Ironman"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/stumble.gif"&gt;Stumble It!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.charteris.com/aggbug.aspx?PostID=938" width="1" height="1"&gt;</description></item><item><title>Cloud Computing - Seeing Through The Mist – An Introduction</title><link>http://blogs.charteris.com/blogs/rogerw/archive/2010/04/21/cloud-computing-seeing-through-the-mist-an-introduction.aspx</link><pubDate>Wed, 21 Apr 2010 11:17:00 GMT</pubDate><guid isPermaLink="false">0cdfd867-77e4-483c-9e74-84c93cc8eba0:937</guid><dc:creator>rogerw</dc:creator><slash:comments>0</slash:comments><description>&lt;h4&gt;Progress But More To Do &lt;/h4&gt;
&lt;p&gt;Over the past nine months,&amp;nbsp; I have been getting increasingly involved in the world of Windows Azure and Cloud Computing and its usage in the world of custom development with web and mobile applications. With &lt;a href="http://www.microsoft.com/azure" target="_blank"&gt;Windows Azure&lt;/a&gt; officially launched and operational, an enterprise looking to put part of their IT infrastructure and business processes into a cloud-based environment, now has some significant alternatives to choose from, with all the major online players (Microsoft, Google, Amazon) represented. &lt;/p&gt;
&lt;p&gt;Significant technical and regulatory challenges remain in the area of data security and integration. In turn,&amp;nbsp; many of these challenges are both cultural and geo-political in origin. However the ease and flexibility of delivering cloud solutions is progressing with each evolution of the toolsets.&amp;nbsp;&amp;nbsp;&amp;nbsp; I’ll be covering further aspects of this and its integration to the .Net and Windows Mobile worlds in future articles. &lt;/p&gt;
&lt;h4&gt;Virtually There….Or There….&lt;/h4&gt;
&lt;p&gt;Broken into its component elements, Cloud Computing is not a new concept. The idea of centralised provision of IT facilities, commodity priced server hardware&amp;nbsp; and the provision of ubiquitous network bandwidth have all been around for a very long time (remember mainframe bureaus anyone?) . What is key to the growth of cloud computing is the coming together of these technologies with the ability to virtualise operating systems and platforms and deploy at short notice.&amp;nbsp; This enables multiple often un-related virtual machines to reside on one physical host. These “virtual machines” can be moved, duplicated and started at will and are key to the flexible nature of cloud provision. The more constant and homogenous the virtual platform image the easier the operational management aspects. &lt;/p&gt;
&lt;p&gt;The greater the degree of virtualisation the greater the ability to scale application provision on demand. Economies of scale mean that if a third party has enough virtual capacity and can manage and guarantee the service levels needed,&amp;nbsp; they can rent the virtual platform to whoever needs it. The whole cost model is built on demand being elastic so that varying levels of spare capacity is always available to service the needs of other organisations. Correspondingly solutions which require continuously high level of custom resource provision,&amp;nbsp; for long periods,&amp;nbsp; tend not to extract the maximum value from many cloud computing charging models. &lt;/p&gt;
&lt;h4&gt;‘Cloud Computing’ – a problem of definition&lt;/h4&gt;
&lt;p&gt;Although the technology choices may be getting clearer, the sheer volume of marketing hype and differing interpretations,&amp;nbsp; mean that it is often unclear what exactly is meant by the term “Cloud Computing”.&amp;nbsp; Different institutions and commercial organisations have different definitions for this depending on their heritage and technology preference etc.&amp;nbsp; However, there are several common agreed scenarios commercially available as follows: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IaaS – Infrastructure-as-a-Service – this is largely based on the provision of virtualised infrastructure platforms by a third party. A customer can run and manage their own operating system platforms (patch levels, deployed software etc) but the third party manages the underlying infrastructure. Cost is normally based on resource usage and some form of metering mechanism.&amp;nbsp;&amp;nbsp; &lt;/li&gt;
&lt;li&gt;PaaS - Platform-as-a-Service – this uses virtualisation to deliver both application and operating system, Applications are decoupled from specific infrastructure locations and provision is increased and duplicated to match the anticipated and actual levels of user demand. Costs are normally based on resource usage, agreed service level and levels of inbound and outbound data. &lt;/li&gt;
&lt;li&gt;SaaS – Software-as-a-Service – this is a fully managed application delivered to a customer as a service. Application software facilities are effectively rented, often on a per user per month basis. Customisation in a limited form is usually permitted but very often only via changes made by the cloud provider. &lt;/li&gt;&lt;/ul&gt;
&lt;h4&gt;Inside Or Outside The Enterprise – ‘Private’ versus ‘Public’ Cloud&lt;/h4&gt;
&lt;p&gt;The pure definition and implementation of most of these concepts would consider them to be deployed totally externally to the organisation and run by a third party on the their behalf.&amp;nbsp; For many organisations such (banks, central and local government etc) the regulatory or data security concerns means that a “public cloud” offering is simply not viable. Some large organisations also have made very significant investments in very large data centres that are equally capable of running similar solutions but in a secure “private&amp;quot; cloud manner.&amp;nbsp; Solutions for this space are only just starting to emerge in the UK and USA&amp;nbsp; but when combined with virtualisation this will be a growth technology area for specific sectors. The benefits are only truly realised however in very large enterprise scale where redundant infrastructure capacity can be harnessed and delivered. &lt;/p&gt;
&lt;h4&gt;Arise the Hybrid…..&lt;/h4&gt;
&lt;p&gt;Many more astute organisation are learning that greater benefits can be obtained by the use of ‘hybrid clouds’. These maximise the cost and availability benefits of any public cloud offering where appropriate, but also obtain the maximum value from existing internal investment and functional provision.&amp;nbsp; Toolsets and frameworks such as &lt;a href="http://www.microsoft.com/windowsazure/appfabric/" target="_blank"&gt;Windows Azure Platform AppFabric&lt;/a&gt; are increasing progressing, so as&amp;nbsp; to allow solutions which use on-site and cloud integrations together in one place. &lt;/p&gt;
&lt;p&gt;I’ll return to this subject of Cloud Computing in future posts, as there are many technical and non-technical issues to consider. We’ll also look at the key high level issues in moving applications to cloud based platforms. &lt;/p&gt;
&lt;h4&gt;Useful Articles &lt;/h4&gt;
&lt;p&gt;In the meantime,&amp;nbsp; to find out more information about Cloud Computing it is worth taking a look at the following sources: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;Above The Clouds Paper – University of Berkeley – often considered one of the “classic” cloud computing academic papers. It covers the theoretical concepts behind cloud computing and can be found at: &lt;a title="http://www.eecs.berkeley.edu/Pubs/TechRpts/2009/EECS-2009-28.html" href="http://www.eecs.berkeley.edu/Pubs/TechRpts/2009/EECS-2009-28.html"&gt;http://www.eecs.berkeley.edu/Pubs/TechRpts/2009/EECS-2009-28.html&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div align="left"&gt;‘Outlook: partly cloudy with sunny spells to follow’ – this is a paper on Hybrid Cloud computing and many other aspects of Cloud Computing by Matt Deacon from Microsoft and Dan Scarfe from Dot Net Solutions Ltd, which is available &lt;a href="http://www.dotnetsolutions.co.uk/Assets/pdfs/Hybrid%20Cloud%20White%20Paper.pdf" target="_blank"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div align="left"&gt;Windows Azure Platform – A series of white papers on Windows Azure are available at &lt;a title="http://www.microsoft.com/windowsazure/whitepapers/" href="http://www.microsoft.com/windowsazure/whitepapers/"&gt;http://www.microsoft.com/windowsazure/whitepapers/&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;div id="SocialBookmarks"&gt;&lt;a href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2frogerw%2farchive%2f2010%2f04%2f21%2fcloud-computing-seeing-through-the-mist-an-introduction.aspx&amp;tags=&amp;title=Cloud+Computing+-+Seeing+Through+The+Mist+%e2%80%93+An+Introduction" mce_href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2frogerw%2farchive%2f2010%2f04%2f21%2fcloud-computing-seeing-through-the-mist-an-introduction.aspx&amp;tags=&amp;title=Cloud+Computing+-+Seeing+Through+The+Mist+%e2%80%93+An+Introduction"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/delicious.gif"&gt;Del.icio.us&amp;nbsp;&lt;/a&gt;&lt;a href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2frogerw%2farchive%2f2010%2f04%2f21%2fcloud-computing-seeing-through-the-mist-an-introduction.aspx&amp;title=Cloud+Computing+-+Seeing+Through+The+Mist+%e2%80%93+An+Introduction&amp;tags=" mce_href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2frogerw%2farchive%2f2010%2f04%2f21%2fcloud-computing-seeing-through-the-mist-an-introduction.aspx&amp;title=Cloud+Computing+-+Seeing+Through+The+Mist+%e2%80%93+An+Introduction&amp;tags="&gt;&lt;img border="0" src="/Themes/leanandgreen/images/digg.gif"&gt;Digg It&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2frogerw%2farchive%2f2010%2f04%2f21%2fcloud-computing-seeing-through-the-mist-an-introduction.aspx" mce_href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2frogerw%2farchive%2f2010%2f04%2f21%2fcloud-computing-seeing-through-the-mist-an-introduction.aspx"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/facebook.gif"&gt;Share on Facebook&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2frogerw%2farchive%2f2010%2f04%2f21%2fcloud-computing-seeing-through-the-mist-an-introduction.aspx&amp;title=Cloud+Computing+-+Seeing+Through+The+Mist+%e2%80%93+An+Introduction" mce_href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2frogerw%2farchive%2f2010%2f04%2f21%2fcloud-computing-seeing-through-the-mist-an-introduction.aspx&amp;title=Cloud+Computing+-+Seeing+Through+The+Mist+%e2%80%93+An+Introduction"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/stumble.gif"&gt;Stumble It!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.charteris.com/aggbug.aspx?PostID=937" width="1" height="1"&gt;</description><category domain="http://blogs.charteris.com/blogs/rogerw/archive/tags/Windows+Azure/default.aspx">Windows Azure</category><category domain="http://blogs.charteris.com/blogs/rogerw/archive/tags/AppFabric/default.aspx">AppFabric</category><category domain="http://blogs.charteris.com/blogs/rogerw/archive/tags/Hybrid+Clouds/default.aspx">Hybrid Clouds</category><category domain="http://blogs.charteris.com/blogs/rogerw/archive/tags/Cloud+Computing/default.aspx">Cloud Computing</category></item><item><title>Some SharePoint 2010 Limits</title><link>http://blogs.charteris.com/blogs/colinn/archive/2010/04/20/capacity-planning-sharepoint-2010.aspx</link><pubDate>Tue, 20 Apr 2010 07:55:18 GMT</pubDate><guid isPermaLink="false">0cdfd867-77e4-483c-9e74-84c93cc8eba0:936</guid><dc:creator>colinn</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;In Mike Watson’s talk on SQL planning he highlighted some recently published numbers for SharePoint 2010 capacity:&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2"&gt;     &lt;tr&gt;       &lt;td&gt;         &lt;p align="center"&gt;&lt;strong&gt;Category&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p align="center"&gt;&lt;strong&gt;2007 Capacity&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p align="center"&gt;&lt;strong&gt;2010 Capacity&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Content Database&lt;/td&gt;        &lt;td&gt;         &lt;p align="center"&gt;100 GB&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p align="center"&gt;200 GB&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;File Size*&lt;/td&gt;        &lt;td&gt;         &lt;p align="center"&gt;2 GB&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p align="center"&gt;2 GB&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Databases per web app&lt;/td&gt;        &lt;td&gt;         &lt;p align="center"&gt;100&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p align="center"&gt;300&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Site Collection Size&lt;/td&gt;        &lt;td&gt;         &lt;p align="center"&gt;100 GB&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p align="center"&gt;100 GB&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;List Items per view&lt;/td&gt;        &lt;td&gt;         &lt;p align="center"&gt;2000&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p align="center"&gt;5000&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;* &lt;font size="1"&gt;This is a boundary limit dictated by the SQL field. Larger files require another solution such as Remote Blob Storage (RBS).&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;As with 2007, apart from the file size limit, a lot is going to depend on the structure of your data and the size of the files saved. Only the File Size is a ‘hard’ limit the rest is the point where Microsoft would expect a degradation of performance.&lt;/p&gt;
&lt;div id="SocialBookmarks"&gt;&lt;a href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f20%2fcapacity-planning-sharepoint-2010.aspx&amp;tags=&amp;title=Some+SharePoint+2010+Limits" mce_href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f20%2fcapacity-planning-sharepoint-2010.aspx&amp;tags=&amp;title=Some+SharePoint+2010+Limits"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/delicious.gif"&gt;Del.icio.us&amp;nbsp;&lt;/a&gt;&lt;a href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f20%2fcapacity-planning-sharepoint-2010.aspx&amp;title=Some+SharePoint+2010+Limits&amp;tags=" mce_href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f20%2fcapacity-planning-sharepoint-2010.aspx&amp;title=Some+SharePoint+2010+Limits&amp;tags="&gt;&lt;img border="0" src="/Themes/leanandgreen/images/digg.gif"&gt;Digg It&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f20%2fcapacity-planning-sharepoint-2010.aspx" mce_href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f20%2fcapacity-planning-sharepoint-2010.aspx"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/facebook.gif"&gt;Share on Facebook&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f20%2fcapacity-planning-sharepoint-2010.aspx&amp;title=Some+SharePoint+2010+Limits" mce_href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f20%2fcapacity-planning-sharepoint-2010.aspx&amp;title=Some+SharePoint+2010+Limits"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/stumble.gif"&gt;Stumble It!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.charteris.com/aggbug.aspx?PostID=936" width="1" height="1"&gt;</description></item><item><title>SharePoint Governance 101at Evolution 2010</title><link>http://blogs.charteris.com/blogs/colinn/archive/2010/04/19/sharepoint-governance-101at-evolution-2010.aspx</link><pubDate>Mon, 19 Apr 2010 14:14:00 GMT</pubDate><guid isPermaLink="false">0cdfd867-77e4-483c-9e74-84c93cc8eba0:934</guid><dc:creator>colinn</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Was sat in a talk by Paul Turner of HP Software (he’s their World Wide Services Competency leader for SharePoint). The subject was Designing Information Management for the Masses but as you can probably guess what it boiled down to was a matter of governance and Paul reminded me of the four main tenets of any good SharePoint Governance Plan:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;People – &lt;/strong&gt;clear vision and defined roles and responsibilities&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Technology – &lt;/strong&gt;service level agreements&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Policy – &lt;/strong&gt;design and usage principles&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Process – &lt;/strong&gt;common tasks that need to performed&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;And why do you need governance? Well top of the list for me is ‘SharePoint sprawl’. Giving those users the ability to create content, sometimes hideously complex content and solutions, can result in an explosive growth of sites, sub sites and even site collections. Even I with my simple dev background can understand the potential impact of allowing users to add content ungoverned. From a usability perspective there is the inability to find useful content and if users can’t find what their looking for the system will soon fall into disrepute and alternatives will be found (watch them mail boxes grow once more) From an infrastructure view unchecked content can lead to a strain on network and database resources.&lt;/p&gt;  &lt;p&gt;Content quality will be hit too if there are no policy on metadata or the location certain assets should be saved to. It can also impair decision making if the data is difficult to find and assimilate then the business leaders are going to be unable to make informed, timely decisions.&lt;/p&gt;  &lt;p&gt;Finally – ok finally for this simplistic article, there’s plenty out there on the subject – without proper governance from the outset there is a risk that the SharePoint implementation will never be fully aligned with the business and thus the business will never get full value from it. Naturally, this then runs the risk of the business never valuing the platform and the implementation and indeed product forging a reputation of failure.&lt;/p&gt;
&lt;div id="SocialBookmarks"&gt;&lt;a href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f19%2fsharepoint-governance-101at-evolution-2010.aspx&amp;tags=&amp;title=SharePoint+Governance+101at+Evolution+2010" mce_href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f19%2fsharepoint-governance-101at-evolution-2010.aspx&amp;tags=&amp;title=SharePoint+Governance+101at+Evolution+2010"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/delicious.gif"&gt;Del.icio.us&amp;nbsp;&lt;/a&gt;&lt;a href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f19%2fsharepoint-governance-101at-evolution-2010.aspx&amp;title=SharePoint+Governance+101at+Evolution+2010&amp;tags=" mce_href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f19%2fsharepoint-governance-101at-evolution-2010.aspx&amp;title=SharePoint+Governance+101at+Evolution+2010&amp;tags="&gt;&lt;img border="0" src="/Themes/leanandgreen/images/digg.gif"&gt;Digg It&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f19%2fsharepoint-governance-101at-evolution-2010.aspx" mce_href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f19%2fsharepoint-governance-101at-evolution-2010.aspx"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/facebook.gif"&gt;Share on Facebook&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f19%2fsharepoint-governance-101at-evolution-2010.aspx&amp;title=SharePoint+Governance+101at+Evolution+2010" mce_href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f19%2fsharepoint-governance-101at-evolution-2010.aspx&amp;title=SharePoint+Governance+101at+Evolution+2010"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/stumble.gif"&gt;Stumble It!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.charteris.com/aggbug.aspx?PostID=934" width="1" height="1"&gt;</description></item><item><title>SharePoint Evolution 2010 Keynote</title><link>http://blogs.charteris.com/blogs/colinn/archive/2010/04/19/sharepoint-evolution-2010-keynote.aspx</link><pubDate>Mon, 19 Apr 2010 12:18:29 GMT</pubDate><guid isPermaLink="false">0cdfd867-77e4-483c-9e74-84c93cc8eba0:935</guid><dc:creator>colinn</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;The Icelandic fire gods have taken their toll on the conference with much reorganisation of the agenda to give those speakers who haven’t made it the chance of getting here by Wednesday.&lt;/p&gt;  &lt;p&gt;Still, as Steve Smith pointed out in the keynote there were cons and pros to the situation, some folks couldn’t make it to the UK but then others couldn’t leave and they have been enlisted to ensure the conference goes on.&lt;/p&gt;  &lt;p&gt;The mystery keynote speakers were revealed, as well as Mr Smith, Eric Shupps, Spencer Harbar and Brett Lonsdale took to the stage to give attendees a good dose of nostalgia.&lt;/p&gt;  &lt;p&gt;Whether the audience wanted to be reminded of the “quirky charm” of 2001, 2003 and 2007 versions of SharePoint I’m not sure but there were a few of us older types with tears in our eyes (some may have been joyful most I suspect not, one chap beside me started to shake and mutter) as we were taken through the delights of SharePoint’s growth from small web based storage app to all conquering integration and application platform.&lt;/p&gt;  &lt;p&gt;From the basic document management available in 2001 (though allegedly not a recognised member of the family) through the introduction of SQL in 2003 and finally to the feature/solution package deployment framework.&lt;/p&gt;  &lt;p&gt;Of course nobody could answer the question, why did Microsoft stick with that blue?&amp;#160; &lt;/p&gt;
&lt;div id="SocialBookmarks"&gt;&lt;a href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f19%2fsharepoint-evolution-2010-keynote.aspx&amp;tags=&amp;title=SharePoint+Evolution+2010+Keynote" mce_href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f19%2fsharepoint-evolution-2010-keynote.aspx&amp;tags=&amp;title=SharePoint+Evolution+2010+Keynote"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/delicious.gif"&gt;Del.icio.us&amp;nbsp;&lt;/a&gt;&lt;a href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f19%2fsharepoint-evolution-2010-keynote.aspx&amp;title=SharePoint+Evolution+2010+Keynote&amp;tags=" mce_href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f19%2fsharepoint-evolution-2010-keynote.aspx&amp;title=SharePoint+Evolution+2010+Keynote&amp;tags="&gt;&lt;img border="0" src="/Themes/leanandgreen/images/digg.gif"&gt;Digg It&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f19%2fsharepoint-evolution-2010-keynote.aspx" mce_href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f19%2fsharepoint-evolution-2010-keynote.aspx"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/facebook.gif"&gt;Share on Facebook&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f19%2fsharepoint-evolution-2010-keynote.aspx&amp;title=SharePoint+Evolution+2010+Keynote" mce_href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f19%2fsharepoint-evolution-2010-keynote.aspx&amp;title=SharePoint+Evolution+2010+Keynote"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/stumble.gif"&gt;Stumble It!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.charteris.com/aggbug.aspx?PostID=935" width="1" height="1"&gt;</description></item><item><title>SharePoint Evolution Conference 2010</title><link>http://blogs.charteris.com/blogs/colinn/archive/2010/04/18/sharepoint-evolution-conference-2010.aspx</link><pubDate>Sun, 18 Apr 2010 18:46:47 GMT</pubDate><guid isPermaLink="false">0cdfd867-77e4-483c-9e74-84c93cc8eba0:933</guid><dc:creator>colinn</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Tomorrow is the first day of the &lt;a href="http://www.sharepointevolutionconference.com/"&gt;SharePoint Evolution Conference&lt;/a&gt; in London. The conference is going ahead despite the best efforts of Icelandic volcanoes; planes may be grounded, the sky may be awash with ash but SharePoint carries on regardless!&lt;/p&gt;  &lt;p&gt;With the RTM released this month and the official launch only a few weeks away the conference has a very 2010 feel to it, there’s not too much for those interested in 2007. I guess this is understandable, it’s a technology conference and if there’s one thing that technologists like it&amp;#39;s something that can have the adjectives ‘new’, ‘shiny’ and ‘improved’ placed in front of them (unless it’s washing powder – not really too excited by that).&lt;/p&gt;  &lt;p&gt;The speakers have a familiar feel Spencer Harbar, Eric Shupps, Mike Watson, Steve Smith, Joel Oleson, Andrew Connell, Bill English to name but a few. All of these guys will have by now had extensive exposure to the supposed wonder that is SharePoint 2010 (supposed? no,truly it is wonderful!) and it’ll be interesting to hear what they have learned since Vegas’ conference.&lt;/p&gt;  &lt;p&gt;One mystery remains. Who will deliver the keynote? Having spent literally seconds exploring the Evolution Conference site I can find no clues…&lt;/p&gt;
&lt;div id="SocialBookmarks"&gt;&lt;a href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f18%2fsharepoint-evolution-conference-2010.aspx&amp;tags=&amp;title=SharePoint+Evolution+Conference+2010" mce_href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f18%2fsharepoint-evolution-conference-2010.aspx&amp;tags=&amp;title=SharePoint+Evolution+Conference+2010"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/delicious.gif"&gt;Del.icio.us&amp;nbsp;&lt;/a&gt;&lt;a href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f18%2fsharepoint-evolution-conference-2010.aspx&amp;title=SharePoint+Evolution+Conference+2010&amp;tags=" mce_href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f18%2fsharepoint-evolution-conference-2010.aspx&amp;title=SharePoint+Evolution+Conference+2010&amp;tags="&gt;&lt;img border="0" src="/Themes/leanandgreen/images/digg.gif"&gt;Digg It&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f18%2fsharepoint-evolution-conference-2010.aspx" mce_href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f18%2fsharepoint-evolution-conference-2010.aspx"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/facebook.gif"&gt;Share on Facebook&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f18%2fsharepoint-evolution-conference-2010.aspx&amp;title=SharePoint+Evolution+Conference+2010" mce_href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f04%2f18%2fsharepoint-evolution-conference-2010.aspx&amp;title=SharePoint+Evolution+Conference+2010"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/stumble.gif"&gt;Stumble It!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.charteris.com/aggbug.aspx?PostID=933" width="1" height="1"&gt;</description></item><item><title>SharePoint 2010 and Office 2010 Launch</title><link>http://blogs.charteris.com/blogs/alistairl/archive/2010/03/08/sharepoint-2010-and-office-2010-launch.aspx</link><pubDate>Mon, 08 Mar 2010 09:42:32 GMT</pubDate><guid isPermaLink="false">0cdfd867-77e4-483c-9e74-84c93cc8eba0:922</guid><dc:creator>alistairl</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Arpan Shah has blogged over at Microsoft that May 12th, 2010 is the launch date for SharePoint 2010 and Office 2010. In addition, they have announced intent to RTM this April 2010. &lt;a href="http://blogs.msdn.com/sharepoint/archive/2010/03/05/sharepoint-2010-office-2010-launch.aspx"&gt;Take a look at the post over on the SharePoint Team Blog&lt;/a&gt; which I recommend you keep up to date with if you are interested in SharePoint.&lt;/p&gt;  &lt;p&gt;The release of the RTM is quite exciting for us as this is a way for key customers to be ready with SharePoint 2010 ahead of May. If you would like to know more then please get in touch.&lt;/p&gt;
&lt;div id="SocialBookmarks"&gt;&lt;a href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2falistairl%2farchive%2f2010%2f03%2f08%2fsharepoint-2010-and-office-2010-launch.aspx&amp;tags=&amp;title=SharePoint+2010+and+Office+2010+Launch" mce_href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2falistairl%2farchive%2f2010%2f03%2f08%2fsharepoint-2010-and-office-2010-launch.aspx&amp;tags=&amp;title=SharePoint+2010+and+Office+2010+Launch"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/delicious.gif"&gt;Del.icio.us&amp;nbsp;&lt;/a&gt;&lt;a href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2falistairl%2farchive%2f2010%2f03%2f08%2fsharepoint-2010-and-office-2010-launch.aspx&amp;title=SharePoint+2010+and+Office+2010+Launch&amp;tags=" mce_href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2falistairl%2farchive%2f2010%2f03%2f08%2fsharepoint-2010-and-office-2010-launch.aspx&amp;title=SharePoint+2010+and+Office+2010+Launch&amp;tags="&gt;&lt;img border="0" src="/Themes/leanandgreen/images/digg.gif"&gt;Digg It&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2falistairl%2farchive%2f2010%2f03%2f08%2fsharepoint-2010-and-office-2010-launch.aspx" mce_href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2falistairl%2farchive%2f2010%2f03%2f08%2fsharepoint-2010-and-office-2010-launch.aspx"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/facebook.gif"&gt;Share on Facebook&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2falistairl%2farchive%2f2010%2f03%2f08%2fsharepoint-2010-and-office-2010-launch.aspx&amp;title=SharePoint+2010+and+Office+2010+Launch" mce_href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2falistairl%2farchive%2f2010%2f03%2f08%2fsharepoint-2010-and-office-2010-launch.aspx&amp;title=SharePoint+2010+and+Office+2010+Launch"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/stumble.gif"&gt;Stumble It!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.charteris.com/aggbug.aspx?PostID=922" width="1" height="1"&gt;</description><category domain="http://blogs.charteris.com/blogs/alistairl/archive/tags/SharePoint/default.aspx">SharePoint</category><category domain="http://blogs.charteris.com/blogs/alistairl/archive/tags/SharePoint+2010/default.aspx">SharePoint 2010</category></item><item><title>The Shared Services Provider is Dead…</title><link>http://blogs.charteris.com/blogs/colinn/archive/2010/02/02/the-shared-services-provider-is-dead.aspx</link><pubDate>Tue, 02 Feb 2010 20:34:00 GMT</pubDate><guid isPermaLink="false">0cdfd867-77e4-483c-9e74-84c93cc8eba0:911</guid><dc:creator>colinn</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;…eh long live services ‘a la carte’ – somebody from marketing really needs to get hold of that one! (and please excuse my French).&lt;/p&gt;  &lt;p&gt;What it means is this - &lt;/p&gt;  &lt;p&gt;In SharePoint 2007 the Shared Services Provider was a specialist web application (two if you include MySites) which looked after Enterprise Search, Profiling, Excel Services and the Business Data Catalog.&lt;/p&gt;  &lt;p&gt;Although this worked pretty well it had a couple of major limitations -&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;It’s not a scalable model – you could have more than one SSP in a server farm but if the desire was to have a slightly different flavour of SSP, for example specialist or restricted search it was a lot of overhead.&lt;/li&gt;    &lt;li&gt;It wasn’t granular – SSP’s had very coarse permissions, once a site was attached to an SSP it had all the services running on it. Administrators either had access to the SSP configuration site and all services or they didn’t!&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;No finesse at all!&lt;/p&gt;  &lt;p&gt;The new Service Application Model is broken into discreet service applications allowing web applications to be more finely tailored to their user base.&lt;/p&gt;  &lt;p&gt;This is done through a series of proxies which are assigned into Proxy Groups. In a straight 2010 installation there will be a Default Proxy Group which web applications will automatically take on. Services can belong to more than one group and (wait for it) more than one instance of a service can be running in a farm. So for example the Excel Services service Finance uses may not be the same as the one in use by Marketing.&lt;/p&gt;  &lt;p&gt;Naturally, you can create your own Proxy Groups.&lt;/p&gt;  &lt;p&gt;This does come at cost, more granular services means more information to keep in state which results in more databases for the SQL Server and the associated maintenance attached to that. To take the People service, which runs MySites in 2010 amongst other things, as an example (albeit an extreme one); this service requires 3 databases to operate.&lt;/p&gt;  &lt;p&gt;And it’s not alone with those hard disk eating, processor stomping needs…&lt;/p&gt;
&lt;div id="SocialBookmarks"&gt;&lt;a href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f02%2f02%2fthe-shared-services-provider-is-dead.aspx&amp;tags=&amp;title=The+Shared+Services+Provider+is+Dead%e2%80%a6" mce_href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f02%2f02%2fthe-shared-services-provider-is-dead.aspx&amp;tags=&amp;title=The+Shared+Services+Provider+is+Dead%e2%80%a6"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/delicious.gif"&gt;Del.icio.us&amp;nbsp;&lt;/a&gt;&lt;a href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f02%2f02%2fthe-shared-services-provider-is-dead.aspx&amp;title=The+Shared+Services+Provider+is+Dead%e2%80%a6&amp;tags=" mce_href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f02%2f02%2fthe-shared-services-provider-is-dead.aspx&amp;title=The+Shared+Services+Provider+is+Dead%e2%80%a6&amp;tags="&gt;&lt;img border="0" src="/Themes/leanandgreen/images/digg.gif"&gt;Digg It&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f02%2f02%2fthe-shared-services-provider-is-dead.aspx" mce_href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f02%2f02%2fthe-shared-services-provider-is-dead.aspx"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/facebook.gif"&gt;Share on Facebook&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f02%2f02%2fthe-shared-services-provider-is-dead.aspx&amp;title=The+Shared+Services+Provider+is+Dead%e2%80%a6" mce_href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f02%2f02%2fthe-shared-services-provider-is-dead.aspx&amp;title=The+Shared+Services+Provider+is+Dead%e2%80%a6"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/stumble.gif"&gt;Stumble It!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.charteris.com/aggbug.aspx?PostID=911" width="1" height="1"&gt;</description></item><item><title>Virtual Ignite SharePoint 2010 Training for IT PRO</title><link>http://blogs.charteris.com/blogs/colinn/archive/2010/02/01/virtual-ignite-sharepoint-2010-training-for-it-pro.aspx</link><pubDate>Mon, 01 Feb 2010 07:29:47 GMT</pubDate><guid isPermaLink="false">0cdfd867-77e4-483c-9e74-84c93cc8eba0:910</guid><dc:creator>colinn</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;This week I’m attending Ignite Training for SharePoint 2010.&lt;/p&gt;  &lt;p&gt;I will of course be posting any interesting bits that come up.&lt;/p&gt;  &lt;p&gt;But the format is quite interesting with a mixture of presenters, labs, video and live meetings all done over the web. It remains to be seen whether this can engage attendees fully without face to face contact. I suspect discipline on all sides will be required.&lt;/p&gt;
&lt;div id="SocialBookmarks"&gt;&lt;a href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f02%2f01%2fvirtual-ignite-sharepoint-2010-training-for-it-pro.aspx&amp;tags=&amp;title=Virtual+Ignite+SharePoint+2010+Training+for+IT+PRO" mce_href="http://del.icio.us/post?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f02%2f01%2fvirtual-ignite-sharepoint-2010-training-for-it-pro.aspx&amp;tags=&amp;title=Virtual+Ignite+SharePoint+2010+Training+for+IT+PRO"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/delicious.gif"&gt;Del.icio.us&amp;nbsp;&lt;/a&gt;&lt;a href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f02%2f01%2fvirtual-ignite-sharepoint-2010-training-for-it-pro.aspx&amp;title=Virtual+Ignite+SharePoint+2010+Training+for+IT+PRO&amp;tags=" mce_href="http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f02%2f01%2fvirtual-ignite-sharepoint-2010-training-for-it-pro.aspx&amp;title=Virtual+Ignite+SharePoint+2010+Training+for+IT+PRO&amp;tags="&gt;&lt;img border="0" src="/Themes/leanandgreen/images/digg.gif"&gt;Digg It&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f02%2f01%2fvirtual-ignite-sharepoint-2010-training-for-it-pro.aspx" mce_href="http://www.facebook.com/share.php?u=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f02%2f01%2fvirtual-ignite-sharepoint-2010-training-for-it-pro.aspx"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/facebook.gif"&gt;Share on Facebook&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f02%2f01%2fvirtual-ignite-sharepoint-2010-training-for-it-pro.aspx&amp;title=Virtual+Ignite+SharePoint+2010+Training+for+IT+PRO" mce_href="http://www.stumbleupon.com/submit?url=http%3a%2f%2fblogs.charteris.com%2fblogs%2fcolinn%2farchive%2f2010%2f02%2f01%2fvirtual-ignite-sharepoint-2010-training-for-it-pro.aspx&amp;title=Virtual+Ignite+SharePoint+2010+Training+for+IT+PRO"&gt;&lt;img border="0" src="/Themes/leanandgreen/images/stumble.gif"&gt;Stumble It!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.charteris.com/aggbug.aspx?PostID=910" width="1" height="1"&gt;</description></item></channel></rss>