Local Database Caching with the Microsoft Sync Framework
presented to NUFWon 11/10/2009

DESIGNING APPLICATIONS FOR
THE OC...
About Me
 Work for Systemental, Inc as a Consultant
  and Software Developer
 Software development to support Corporate
...
A case study in failure

 What could go wrong preparing this
  presentation did
   Initial demo worked in minutes (after...
What we will cover

 What is the Microsoft Sync Framework?
 How you can use it?
 Why?
 How does it work?
 How do you ...
What is the Sync Framework

 Provider-based API for synchronizing data or
  files across multiple applications, services,...
How can it be used?

 Server to Local
 Local to Server
 Bi-directional
Why?

 Why not pub/sub, log shipping, replication?
   Reliability
   Purpose
   schedule granularity
 Disconnected, h...
How does it work?

 Visual Studio local database cache template
 Schema changes (couple fields and
  tombstone)
 Trigge...
Sync Process
Steps to Implement

 Add new item - local database cache
 Create database/tables to sync or modify DDL
 Sync Configurat...
Demo project
Keyboard Encoder Module
Demo project details

 WPF application with a single keystroke input
  F5 key
 Changing background color (green, yellow,...
Demos

 Existing SQL db, switch to CE 3.5 using
    provider and connection string change
   Wizardry
   SQLMetal
   P...
SQLMetal to create Linq2SQL
classes
Gotcha’s
 Visual Studio Linq2SQL template doesn’t support SQL CE
   provider – use SQLMetal to generate, then include in ...
Gotcha’s – primary key

 Primary key defined on table to cache
 auto-incrementing integer primary key,
  unique identity...
Debugging SQL CE 3.5
•   SSMS 2005 gives the following error when you try to connect to a SQL CE 3.5 .sdf file.
•   Create...
Switched PK to GUID from
Int64
Set autogen=true in dbml:
fail!
added id = Guid.NewGuid
Conflict resolution
 Sorry, not covering in Demos
 Enums – conflict types (between sync sessions)
    ClientInsertServe...
Resolution Policies

 Source wins
 Destination wins
 Specified replica wins
 Last writer wins
 Merge
 Log it or defer
References
   http://dean-o.blogspot.com/
   http://channel9.msdn.com/posts/funkyonex/Offline-Data-Synchronization-Servi...
Thank you!

 Website
   http://www.systemental.com
 Blogs
   http://dean-o.blogspot.com/
   http://practicalhoshin.bl...
Upcoming SlideShare
Loading in...5
×

Designing For Occasionally Connected Apps Slideshare

2,501

Published on

Presentation on using the Microsoft Sync Framework to implement a local database cache to sync with an occasionally connected SQL Server

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
2,501
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
22
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • SQL CE – winform db reader or SSMS 2008
  • Show scripts or look at triggers in db. Homework assignment: See how SS knows the .sdf has changes to upload to server. No SS 2008 to look at the schema or attach to Profiler.
  • SQL Profiler
  • Auto-incrementing integer can cause inserting into client and server with the same primary key
  • I was using bigint as the PK, Unique Identifier. This led to intermittent results. Use Guid instead. Apparently SQL CE *doesn’t* support server generated ID’s.
  • Designing For Occasionally Connected Apps Slideshare

    1. 1. Local Database Caching with the Microsoft Sync Framework presented to NUFWon 11/10/2009 DESIGNING APPLICATIONS FOR THE OCCASIONALLY CONNECTED SCENARIO
    2. 2. About Me  Work for Systemental, Inc as a Consultant and Software Developer  Software development to support Corporate business process improvement since 2000 (Lean or Continuous Improvement Initiatives)  .Net since 2004  President, fwPASS.org  Mfg. Eng. Technology degrees from Ball State University
    3. 3. A case study in failure  What could go wrong preparing this presentation did  Initial demo worked in minutes (after about three minor problems)  SQL CE debugging challenges 1. Refactor - created numerous problems 2. Test - find problems requiring schema changes 3. Repeat 1-2 ad nauseum
    4. 4. What we will cover  What is the Microsoft Sync Framework?  How you can use it?  Why?  How does it work?  How do you implement it?  Demo’s  Gotcha’s, gotcha’s, and debugging
    5. 5. What is the Sync Framework  Provider-based API for synchronizing data or files across multiple applications, services, and physical devices  Included providers  Database *  File system  Web – RSS/Atom
    6. 6. How can it be used?  Server to Local  Local to Server  Bi-directional
    7. 7. Why?  Why not pub/sub, log shipping, replication?  Reliability  Purpose  schedule granularity  Disconnected, hello….  Argument: Internet is everywhere and growing  CE vs. Express  Encrypt or password protect the file  Document-safe, no code stored in file  Light 1.8Mb vs. 58Mb
    8. 8. How does it work?  Visual Studio local database cache template  Schema changes (couple fields and tombstone)  Triggers or 2008 Change data capture
    9. 9. Sync Process
    10. 10. Steps to Implement  Add new item - local database cache  Create database/tables to sync or modify DDL  Sync Configuration wizard  Configure source/target databases  add/edit .sdf database  add sync tables  Generate/run scripts to adjust ddl/sync  Generate typed dataset/table adapters (optional)  Generate Linq2SQL or EF classes (optional)  Set sync direction and .Synchronize
    11. 11. Demo project
    12. 12. Keyboard Encoder Module
    13. 13. Demo project details  WPF application with a single keystroke input F5 key  Changing background color (green, yellow, red) based on actual count vs. target count  Two dispatcher timers: 1. Screen display color update (every second) 2. Db synchronization (every minute)  WinForm SQL CE cache table viewer  Using Repository pattern and Linq to SQL
    14. 14. Demos  Existing SQL db, switch to CE 3.5 using provider and connection string change  Wizardry  SQLMetal  Profiler  Server to local sync (default)  local to server sync/bi-directional (code- behind)
    15. 15. SQLMetal to create Linq2SQL classes
    16. 16. Gotcha’s  Visual Studio Linq2SQL template doesn’t support SQL CE provider – use SQLMetal to generate, then include in project  LINQ dbml created from MSSQL, not compatible CE  SSMS 2005 would not open a CE 3.5 .sdf file. Need SSMS 2008  Set sync direction if anything other than server to local  Changing schema’s after generation – remove everything and start over (use sql scripts to roll back)  Insert/Update triggers not auto created?  .sdf is re-initialized to empty and copied to bin/debug if newer  Existing triggers on the table
    17. 17. Gotcha’s – primary key  Primary key defined on table to cache  auto-incrementing integer primary key, unique identity with SQL CE db  Some table defaults like newid() for MSSQL Uniqueidentifer field do not transfer to the .sdf schema definition. Set in code <table>.id=Guid.NewGuid  Linq can’t autogenerate guid on server. Use id=Guid.NewGuid in code
    18. 18. Debugging SQL CE 3.5 • SSMS 2005 gives the following error when you try to connect to a SQL CE 3.5 .sdf file. • Created a WinForm project PeekLocalCache to display data from .sdf file. Caution: make sure you know which .sdf file the app is using (bin/debug, bin/release, project) • SSMS 2008 – hopefully works • Be careful re-creating the .sdf file using the local database cache configuration wizard without deleting the records from the Server table. I cleared out the Server table and ran for a while on 11/2 without ex, on 11/3 cleared out the table and ran for 13 records. Changing to update server table, works. Violation is in local cache db
    19. 19. Switched PK to GUID from Int64
    20. 20. Set autogen=true in dbml: fail!
    21. 21. added id = Guid.NewGuid
    22. 22. Conflict resolution  Sorry, not covering in Demos  Enums – conflict types (between sync sessions)  ClientInsertServerInsert - A new row is created with the same primary key.  ClientUpdateServerUpdate - The same row is updated. Most common  ClientUpdateServerDelete - A row is updated on the client but was deleted on the server.  ClientDeleteServerUpdate - A row is deleted on the client but was updated on the server.  ErrorsOccurred – all others  Methods for handling  Continue  RetryApplyingRow  RetryWithForceWrite
    23. 23. Resolution Policies  Source wins  Destination wins  Specified replica wins  Last writer wins  Merge  Log it or defer
    24. 24. References  http://dean-o.blogspot.com/  http://channel9.msdn.com/posts/funkyonex/Offline-Data-Synchronization-Services-in-Visual- Studio-2008/  http://videoworld-rong.blogspot.com/2009/10/adonet-sync-services.html  http://social.microsoft.com/Forums/en-US/uklaunch2007ado.net/thread/0fd34e49-ae3d-4b50- 91f5-5e24d4a0b145  http://skysigal.xact-solutions.com/Blog/tabid/427/EntryId/898/Using-LinqToSQL-with-SqlServer- Compact.aspx  http://download.microsoft.com/download/A/4/7/A47B7B0E-976D-4F49-B15D- F02ADE638EBE/Compact_Express_Comparison.doc  http://www.developer.com/net/article.php/3815506/Handling-Data-Conflicts-in-the-Microsoft- Sync-Framework.htm  http://www.geekzone.co.nz/JamesHip/6568  http://code.msdn.microsoft.com/sync  http://mattgoebel.spaces.live.com/blog/cns!DB12DAA600AD8227!182.entry?wa=wsignin1.0&sa= 84900002  http://devlicio.us/blogs/billy_mccafferty/archive/2009/11/09/dependency-injection-101.aspx  http://stackoverflow.com/questions/385796/sync-framework-can-i-sync-only-a-subset-of-my- tables  ASP.NET MVC Framework Unleashed by Stephen Walther, SAMS, ISBN 978-0-672-32998-2
    25. 25. Thank you!  Website  http://www.systemental.com  Blogs  http://dean-o.blogspot.com/  http://practicalhoshin.blogspot.com  Twitter  http://www.twitter.com/deanwillson  Email  dean@systemental.com  LinkedIn  http://www.linkedin.com/in/deanwillson
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×