Another option is Microsoft Sync Framework - version 2 also works with non-MS data sources. Andrew
---------------------------------------- From: "David Rhys Jones" <[email protected]> Sent: Wednesday, March 27, 2013 8:39 PM To: "ozDotNet" <[email protected]> Subject: Re: occasionally connected application design problem This is just an Idea, Message Queues, - pick your flavor. Server and Clients have incoming queues. the server queue thread turns continuously listing to it's incoming queue and post backs all the updates / insert / deletes to the client queues (except the one making the update); the clients connect when they can and pull down as much information possible from their queue and make the changes. (* it's in order so shouldn't be a problem). I suppose there is a way to do it with Sql Server, are all the clients working with the same version? Davy, The US Congress voted Pizza sauce a vegetable. Don't even try to convince me of anything in the states is sane any more! On Wed, Mar 27, 2013 at 11:06 AM, Corneliu I. Tusnea <[email protected]> wrote: Greg, I'm sure the SQL guys will tell you about some "magical tool" that can do all of this for you hands free and without any headaches (fingers crossed) but my take would be the good old REST API model. 1. For every Table have two columns LastUpdated, LastUploaded and LastDownloaded. Every change you do locally you update the LastUpdated to UTC now (never use local times!) 2. Keep a table with the "sync status" of each table where all you need to store is the TableName, LastUploaded and LastDownloaded.3. Have a background thread that tries to monitor for network events (don't continuously try to ping your server as your'll burn the battery of those devices). http://www.codeproject.com/Articles/64975/Detect-Internet-Network-Availability 4. When you have connectivity all you need to do is select top 100 from each table where LastUpdatd for the Status for the table < LastUpdated of the row.(I don't know if I make sense but basically you want to select all the rows that were changed since point of your LastUpdated in your Status table). You then try to push those back to your server. For every row that "made it" to the server you update the LastUploaded to UtcNow or even better I would update it to the time just before you started the sync. 5. You do the reverse for downloading data. You ask the server for all changes since your LastDownload. Once all the changes were received, you update your own LastDownload.With a bit of reflection and some clear naming conventions you could code all of this generically enough that you can simply run it on your database disregarding the number of tables & columns. I'm now going to let the SQL guys deliver their magical tool :) Regards,Corneliu. On Wed, Mar 27, 2013 at 8:41 PM, Greg Harris <[email protected]> wrote: Dear People, I need some help to get some good ideas for a design issue I am facing. The application will be geographically dispersed and only occasionally connected to the internet with a slow / unreliable connection. The users at remote branch offices are doing daily data entry to their own local databases (probably SQL express databases). On a periodic basis the remote branch offices need to synchronise data with head office (probably a full SQL database). Most (99%) of data will travel from the remote branch offices the head office some reference data may travel back to the remote branch office. There are a couple of design ideas that I have had: SQL Server Replication: (http://msdn.microsoft.com/en-us/library/ms151198.aspx) I do not know how well this will work on wires that are of such poor quality. Also how easy (hard) it will be to support remotely. Program based updates: Have a program running in the background at each site attempting connection with head office transferring data. All rows would have a transferred status flag, that would be set once successful transfer has been acknowledged. File extracts: Once an hour produce a text file (with check sum) of all data entered in the last hour, background job copies file to head office server which will then apply updates to head office server. Please share with me and the group what design ideas and experiences you have had that worked well and the ones you would avoid if faced with the same design decision again today. Many thanks Greg Harris
