Automating Google Workspace (GWS) & more with Apps Script
Local Database Caching with the Microsoft Sync Framework
1. Local Database Caching with the Microsoft Sync Framework
presented to NUFWon 11/10/2009
DESIGNING APPLICATIONS FOR
THE OCCASIONALLY CONNECTED
SCENARIO
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. 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. 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. 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. How can it be used?
Server to Local
Local to Server
Bi-directional
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. How does it work?
Visual Studio local database cache template
Schema changes (couple fields and
tombstone)
Triggers or 2008 Change data capture
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. 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)
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. 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. 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
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. Resolution Policies
Source wins
Destination wins
Specified replica wins
Last writer wins
Merge
Log it or defer
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.