13

Buduję program C# dla tabletów systemu Windows, które są zsynchronizowane z bazą danych. Każda z nich będzie miała własną lokalną bazę danych SQL Server, z którą będą współpracować przy użyciu SQL Server Express.Jak scalać i synchronizować pliki baz danych SQL Server?

Jednak użytkownicy usuwają tablety z połączenia internetowego i wprowadzają zmiany. Następnie, gdy ktoś ponownie połączy się z siecią zawierającą "kopię główną" bazy danych, chcę zsynchronizować z nią bazę danych .MDF. Następnie zastąp pliki bazy danych komputera i tabletu nowo zsynchronizowanym.

Mam kolumnę uniqueidentifier i datetime z tego ostatniego wiersza, który został ostatnio zmieniony, więc jeśli wystąpiły konflikty, po prostu wykonam ostatnią zmianę.

Przeczytałem trochę literatury na ten temat, ale chciałbym zobaczyć wyraźny przykład lub samouczek, jak to zrobić. Wiem, co chcę, to Merge Replication, i że Microsoft Sync Framework wydaje się mieć pożądaną funkcjonalność. Po prostu staram się to wdrożyć. Możesz też polecić inne narzędzie, aby to zrobić.

Z góry dziękuję!

+0

jesteś zaznajomiony z następującymi warunkami 'Disconnected rekordów, Delta's' chciałbym zrobić niektóre badania/Google, jak zsynchronizować bazę danych w trybie offline itp. – MethodMan

+0

Nie, nie byłem, dziękuję bardzo! Częścią zmagań, gdy robię to po raz pierwszy, jest to, że nie znam wszystkich właściwych słów kluczowych. –

Odpowiedz

3

Wiem, że to nie jest odpowiedź, ale jestem pewien, że jest to zrobione z Microsoft Sync Framework. Jestem również pewien, że możesz z łatwością zsynchronizować bazę danych z tabletu, nawet jeśli był offline. Jedynym ograniczeniem może być brak synchronizacji na żywo, z której należy korzystać z usług Azure, WebSockets, Apache MQ lub cokolwiek innego. Przepraszamy za brak dodatkowych informacji. Opublikuję go jako komentarz, ale nie mam wystarczającej liczby punktów.

1

jeśli jest to aplikacja Windows Store (WinRT), musisz użyć Sync Framework Toolkit.

jeśli zwykła aplikacja Windows (WPF, WinForm, itd ...), tak, możesz użyć Sync Framework.

Ideą dla obu jest to, że twoja aplikacja Windows używa lokalnej bazy danych (SQL CE, LocalDB, SQLite, itd ...) dla CRUD, którą czasami synchronizujesz z centralnym serwerem, gdy masz połączenie (przez WCF, jak this)

1

Replikacja seryjna MS jest skomplikowana, ale w oparciu o przypadek użycia większość funkcji nie jest potrzebna. Ostrzegam przed czasem, że wiadomo, że ma problemy. W Enterprise nie jest bardzo niezawodny. Działa, ale wymaga tylko siedzenia dziecka. Jeśli nie masz nic przeciwko wezwaniom serwisowym, kontynuuj. Jeśli potrzebujesz solidnego systemu synchronizacji (w przypadku użycia), lepiej jest toczyć własne przy użyciu tabel kontroli. To nie jest takie trudne; zwłaszcza, że ​​już używasz przewodników jako kluczy podstawowych. Możesz również skorzystać z używania sekwencyjnych przewodników. Losowe guidy będą fragmentować indeks klastrowany, a wydajność bazy danych znacznie ucierpi. Jeśli potrzebujesz pomocy przy implementacji, skontaktuj się ze mną. Z powodzeniem zrobiłem to dla klienta. Przetwarzają ponad milion rekordów dziennie bez jednego problemu. Jeśli nadal chcesz korzystać z replikacji MS Merge, mogę to zrobić również dla Ciebie.

+0

Interesujące, nie słyszałem o tabelach kontrolnych. Sprawdzę to, dzięki. Czy masz również jakieś przemyślenia na temat struktury synchronizacji? –

+0

Szczerze mówiąc, trzymałbym się z dala od ram MS Sync całkowicie w tym przypadku użycia. Jeśli chcesz tylko replikować dane, możesz to zrobić za pomocą tabel kontroli i usługi do przetwarzania oczekujących zmian. To zajmuje trochę więcej pracy z góry, ale w końcu zaoszczędzisz wielu połączeń serwisowych. – itsben

+0

Proszę podać instrukcję "Utwórz tabelę" dla jednej ze swoich tabel. Wygeneruję dla ciebie próbkę. – itsben

0

Większość istniejących narzędzi, takich jak Microsoft Sync i Merge-Replication, kończyło się na tyle, że wydawało się zbyt wielkim przesadą i było więcej kłopotu, niż byłoby to warte.

To jest mój skrypt SQL do bazy danych dołączyć

CREATE DATABASE LocalDatabase 
ON (Filename = 'C:\ProgramData\Clayton\Database.mdf') 
    , (Filename = 'C:\ProgramData\Clayton\Database_log.ldf') 
FOR ATTACH; 
GO 

EXEC sp_addlinkedserver @server='Server' 

Następnie do synchronizacji baz danych

-- update the client from the master 
MERGE [LocalDatabase].[dbo].[tableName] trgt 
using [Server].[ServerDatabase].[dbo].[tableName] src 

ON trgt.id = src.id 

WHEN matched AND trgt.lastmodified <= src.lastmodified THEN 
    -- if the master has a row newer than the client 
    -- update the client      
    UPDATE SET trgt.[allColumns]  = src.[allColumns], 
      trgt.[id]    = src.[id], 
      trgt.[lastmodified] = src.[lastmodified] 

-- delete any rows added by a client 
WHEN NOT matched BY source 
THEN 
    DELETE 

-- insert any rows added by the master 
WHEN NOT matched BY target 
THEN 
    INSERT ([allColumns], 
      [id], 
      [lastmodified]) 
    VALUES (src. [allColumns], 
      src.[id], 
      src.[lastmodified]); 


-- now we update the master from the client 
-- Note: 
-- because the serverDB is a linked server 
-- we can't use another MERGE statement, otherwise 
-- we get the error: "The target of a MERGE statement 
-- cannot be a remote table, a remote view, or a view over remote tables." 

UPDATE 
    serverDB 

SET 
    [allColumns]  = [localDB].[allColumns], 
    [id]    = [localDB].[id], 
    [lastmodified]  = [localDB].[lastmodified] 

FROM 
    [Server].[ServerDatabase].[dbo].[tableName] serverDB 

INNER JOIN 
    [LocalDatabase].[dbo].[tableName] localDB 

-- update where the id is the same but the client is newer than the master 

ON serverDB.id = localDB.id 
     AND localDB.lastmodified >= serverDB.lastmodified 
Powiązane problemy