讲师中心 微信公众号
AI工具推荐 视频效率加速

如何用C#实现数据库的数据同步?双向同步怎么做?

风浩酱_9329

风浩酱_9329

发布时间:2025-09-23 11:29:01

|

762人浏览过

|

来源于php中文网

原创

答案:实现C#数据库双向同步需解决冲突检测与变更追踪,核心方法是添加SyncVersion、SyncSource字段并结合时间戳,通过轮询拉取对方新增或修改的数据,本地比对版本后应用变更,并推送本端未同步数据;推荐使用Dotmim.Sync等框架简化开发,避免手动处理复杂逻辑。

如何用c#实现数据库的数据同步?双向同步怎么做?

实现数据库数据同步,尤其是双向同步,在C#中通常涉及监听数据变更、对比差异并执行更新操作。核心思路是让两个或多个数据库保持一致状态,即使它们在不同时间点被修改。下面介绍一种实用的实现方式。

1. 单向同步基本实现

单向同步指从一个主数据库向另一个目标数据库同步数据。常见做法如下:

  • 使用时间戳字段:在表中添加 LastModified 字段,记录每行最后修改时间。同步时只传输自上次同步以来更改的数据。
  • 轮询变更:定期查询源库中 LastModified 大于上次同步时间的记录。
  • 执行插入/更新:将变更应用到目标库,可用 MERGE 语句或先查后更。
示例代码片段(使用 SQL Server 和 ADO.NET):

string lastSyncTime = GetLastSyncTime(); // 从本地配置或表中读取
string query = "SELECT Id, Name, Email, LastModified FROM Users WHERE LastModified > @lastTime";
using (var sourceConn = new SqlConnection(sourceConnectionString))
using (var destConn = new SqlConnection(destConnectionString))
{
    sourceConn.Open();
    destConn.Open();

    using (var cmd = new SqlCommand(query, sourceConn))
    {
        cmd.Parameters.AddWithValue("@lastTime", lastSyncTime);
        using (var reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                var id = reader["Id"];
                var name = reader["Name"];
                var email = reader["Email"];
                var lastMod = reader["LastModified"];

                // 向目标库插入或更新
                using (var updateCmd = new SqlCommand(@"
                    IF EXISTS (SELECT 1 FROM Users WHERE Id = @id)
                        UPDATE Users SET Name = @name, Email = @email, LastModified = @lastMod WHERE Id = @id
                    ELSE
                        INSERT INTO Users (Id, Name, Email, LastModified) VALUES (@id, @name, @email, @lastMod)", destConn))
                {
                    updateCmd.Parameters.AddWithValue("@id", id);
                    updateCmd.Parameters.AddWithValue("@name", name);
                    updateCmd.Parameters.AddWithValue("@email", email);
                    updateCmd.Parameters.AddWithValue("@lastMod", lastMod);
                    updateCmd.ExecuteNonQuery();
                }
            }
        }
    }
}
// 更新本次同步时间
SaveLastSyncTime(DateTime.Now);

2. 双向同步的关键挑战

双向同步意味着两个数据库都能被修改,需合并彼此的变更。主要难点包括:

Microsoft Skill Creator
Microsoft Skill Creator

使用 Learn MCP 工具为 Microsoft 技术创建代理技能。当用户想要创建教授代理任何 Microsoft 技术的技能时使用。

下载
  • 冲突检测:同一记录在两边都被修改,需决定保留哪个版本。
  • 变更追踪:必须知道每条数据是从哪边来的,以及是否已同步过。
  • 同步顺序:避免死锁或重复同步。

3. 实现双向同步的建议方案

推荐使用“带版本和来源标记”的同步机制:

  • 增加同步字段:为每张表添加 SyncVersion(递增)、SyncSource(如 'A' 或 'B')、IsDeleted 等字段。
  • 本地记录同步状态:维护一张 SyncLog 表,记录已同步的变更批次。
  • 分步同步流程:
    • 从对方库拉取自上次同步后、且 SyncSource ≠ 自身的所有新增/修改。
    • 本地比对同 ID 记录是否存在及版本高低。
    • 若本地有更新版本,跳过;否则应用变更。
    • 将本端未同步的变更推送到对方库,并标记 SyncSource 为本端标识。
  • 处理冲突:可采用策略如“最后写入优先”、“手动干预”或“时间戳+节点优先级”。
简化逻辑示例:

假设数据库 A 和 B 双向同步:

  • A 拉取 B 中 SyncSource = 'B' 且 SyncVersion > 上次同步最大版本的数据。
  • A 对每条记录检查本地是否有更高 SyncVersion。无则更新,有则根据策略处理。
  • A 将本地 SyncSource = 'A' 且未同步的记录发送给 B,并递增其 SyncVersion。
  • B 执行相同流程。

4. 使用现成框架简化开发

手动实现复杂且易出错,可考虑以下工具:

  • Microsoft Sync Framework:官方提供的离线/协作同步平台,支持数据库、文件等。支持双向同步、冲突处理、增量同步。
  • SQL Server Replication:如果使用 SQL Server,可配置事务复制或合并复制,无需编码。
  • 第三方库:如 Dotmim.Sync(开源,支持 SQL Server、MySQL、SQLite 等),API 简洁,适合 .NET 应用。
Dotmim.Sync 示例:

var serverProvider = new SqlSyncProvider(serverConnectionString);
var clientProvider = new SqlSyncProvider(clientConnectionString);
var tables = new string[] { "Users", "Products" };
var agent = new SyncAgent(clientProvider, serverProvider, tables);

var result = await agent.SynchronizeAsync();
Console.WriteLine($"完成:{result.TotalChangesUploaded} 上传,{result.TotalChangesDownloaded} 下载");

基本上就这些。双向同步不复杂但容易忽略细节,关键是设计好版本控制和冲突策略。

热门AI工具

更多
墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

4723

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

971

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

1229

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

6721

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

3443

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

6700

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

9261

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

1250

2024.04.29

Tailwind CSS 如何制作导航栏和卡片
Tailwind CSS 如何制作导航栏和卡片

用 Tailwind CSS 制作导航栏和卡片,可先搭建语义化结构,再组合 Flex、Grid、间距、圆角与阴影类。这里整理横向导航、移动端菜单、卡片网格及悬停效果的相关文章,帮助你把常见页面组件做得清晰且适配不同屏幕。

0

2026.11.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 194人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn