13

Tôi đang xây dựng chương trình C# cho các máy tính bảng cửa sổ được đồng bộ hóa với cơ sở dữ liệu. Mỗi người sẽ có cơ sở dữ liệu SQL Server .MDF cục bộ của riêng họ mà họ tương tác với việc sử dụng SQL Server Express.Làm cách nào để hợp nhất và đồng bộ hóa tệp cơ sở dữ liệu SQL Server?

Tuy nhiên, người dùng sẽ lấy máy tính bảng ra khỏi kết nối internet và thực hiện thay đổi. Sau đó, khi một trong những kết nối lại với mạng có chứa một "bản sao tổng thể" của DataBase, tôi muốn đồng bộ hóa cơ sở dữ liệu .MDF của họ với điều đó. Sau đó, thay thế các tệp cơ sở dữ liệu của máy tính và máy tính bảng bằng một tệp mới được đồng bộ hóa.

Tôi có một cột uniqueidentifierdatetime khi hàng đó được thay đổi lần cuối, vì vậy nếu có xung đột, tôi chỉ thực hiện thay đổi gần đây nhất.

Tôi đã đọc một số tài liệu về điều này, nhưng tôi rất muốn xem một ví dụ hoặc hướng dẫn rõ ràng về cách thực hiện. Tôi biết điều tôi muốn là Merge Replication và rằng Microsoft Sync Framework dường như có chức năng tôi muốn. Tôi chỉ đang đấu tranh để thực hiện nó. Ngoài ra, vui lòng giới thiệu một công cụ khác để thực hiện.

Cảm ơn trước!

+0

là bạn quen với các từ ngữ dưới đây 'RecordSet ngắt kết nối, Delta's' tôi sẽ làm một số nghiên cứu/googling về cách đồng bộ hóa cơ sở dữ liệu khi offline vv .. – MethodMan

+0

Không, tôi đã không, cảm ơn bạn rất nhiều! Một phần của cuộc đấu tranh khi googling công cụ này lần đầu tiên là tôi không biết tất cả các từ khóa đúng. –

Trả lời

3

Tôi biết điều này không có nhiều câu trả lời nhưng tôi chắc chắn điều này được thực hiện với Microsoft Sync Framework. Tôi cũng khá chắc chắn rằng bạn có thể dễ dàng đồng bộ hóa một db từ một máy tính bảng mặc dù nó đã được ngoại tuyến. Giới hạn duy nhất có thể là thiếu đồng bộ hóa trực tiếp mà bạn cần sử dụng các dịch vụ Azure, WebSockets, Apache MQ hoặc bất kỳ thứ gì. Xin lỗi vì thiếu thông tin nhiều hơn, tôi đăng nó như một bình luận nhưng không có đủ điểm.

1

nếu đó là ứng dụng Windows Store (WinRT), bạn phải sử dụng Sync Framework Toolkit.

nếu ứng dụng Windows đơn giản (WPF, WinForms, v.v ...), có, bạn có thể sử dụng Sync Framework. Ý tưởng cho cả hai là ứng dụng Windows của bạn sử dụng cơ sở dữ liệu cục bộ (SQL CE, LocalDB, SQLite, v.v.) cho CRUD mà đôi khi bạn đồng bộ với máy chủ trung tâm khi bạn có kết nối (qua WCF, như this).)

1

Sao chép MS Merge rất phức tạp, nhưng dựa trên trường hợp sử dụng của bạn, bạn sẽ không cần hầu hết các chức năng. Tôi sẽ cảnh báo bạn trước khi nó được biết là có vấn đề. Nó không phải là rất đáng tin cậy trong doanh nghiệp. Nó hoạt động nhưng nó chỉ đòi hỏi em bé ngồi. Nếu bạn không nhớ cuộc gọi dịch vụ, hãy tiếp tục. Nếu bạn muốn có một hệ thống đồng bộ mạnh mẽ (cho trường hợp sử dụng của bạn) thì bạn nên sử dụng các bảng kiểm toán của riêng mình. Nó không phải là khó khăn để làm; đặc biệt là vì bạn đã sử dụng guids làm khóa chính của mình. Bạn cũng sẽ được hưởng lợi từ việc sử dụng các hướng dẫn tuần tự. Các trợ giúp ngẫu nhiên sẽ phân đoạn chỉ số nhóm của bạn và hiệu năng cơ sở dữ liệu của bạn sẽ bị ảnh hưởng rất nhiều. Nếu bạn cần trợ giúp triển khai, hãy liên hệ với tôi. Tôi đã thực hiện thành công việc này cho một khách hàng. Họ xử lý hơn một triệu hồ sơ mỗi ngày mà không có một vấn đề duy nhất. Nếu bạn vẫn muốn sử dụng MS Merge Replication, tôi có thể làm điều đó cho bạn.

+0

Thú vị, tôi chưa nghe nói về bảng kiểm toán. Tôi sẽ kiểm tra nó, cảm ơn. Bạn cũng có bất kỳ suy nghĩ nào về Khung Đồng bộ không? –

+0

Thành thật mà nói, tôi sẽ tránh xa các khuôn khổ MS Sync hoàn toàn cho trường hợp sử dụng này. Nếu bạn chỉ muốn sao chép dữ liệu, bạn có thể làm điều đó với các bảng kiểm tra và một dịch vụ để xử lý các thay đổi đang chờ xử lý. Phải mất một chút công việc lên phía trước nhưng bạn sẽ tiết kiệm cho bạn rất nhiều các cuộc gọi dịch vụ cuối cùng. – itsben

+0

Vui lòng báo cáo "tạo bảng" cho một bảng của bạn. Tôi sẽ tạo một mẫu cho bạn. – itsben

0

Hầu hết các công cụ hiện có như Microsoft Sync và Hợp nhất-Nhân rộng kết thúc dường như giống như quá nhiều quá mức cần thiết và phức tạp hơn nhiều so với giá trị của chúng.

Đây là SQL Script của tôi để đính kèm các cơ sở dữ liệu

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' 

Sau đó, để đồng bộ hóa cơ sở dữ liệu

-- 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 
Các vấn đề liên quan