• C# 使用merge来实现同步


    sql merge 的原理和基本用法可参考  sqlserver merge用法

    如果是同一服务器不同库表进行同步,按这篇文章直接创建个作业即可。那么问题来了,跨服务器如何能过代码实现?

    场景:

    客户服务器属于内网,客户提供了查询人员的接口,通过接口可拿到人员的集合,拿到集合再去与表去做同步。

    思路:

    由于 merge 进行的同步操作是表与表之间的同步,当前得到的只有人员集合,把查询接口得到的人员集合存至表中,然后再去做同步。

    实现:

    IDbConnection conn = new SqlConnection("Data Source=.;Initial Catalog=KBDB;uid=joe;pwd=joe-123;");
    
    
                string createTabSql = "create table PeoCursor(ID nvarchar(50),Name nvarchar(50),UserName  nvarchar(50),PassWord nvarchar(50),PeoTypeID nvarchar(50))";
                conn.Execute(createTabSql);
    
                List<peoTableInfo> peoList = new List<peoTableInfo>();
                peoTableInfo peoa = new peoTableInfo("peo101", "张三三", "zhang", "123456", "1");
                peoTableInfo peob = new peoTableInfo("peo101", "李三三", "li", "123456", "1");
                peoList.Add(peoa);
                peoList.Add(peob);
    
                conn.Execute("insert into PeoCursor values (@ID,@Name,@UserName,@PassWord,@PeoTypeID)", peoList);
    
                string tbsql = "merge [KBDB].[dbo].[kb_People] as a " +
                    "using PeoCursor as b " +
                    "on a.ID=b.ID " +
                    "when MATCHED then " +
                    "update set a.name = b.name,a.username = b.username,a.password = b.password,a.peotypeid = b.peotypeid " +
                    "WHEN NOT MATCHED THEN " +
                    "insert(id, name, username, password, peotypeid) values(b.id, b.name, b.username, b.password, b.peotypeid);";
    
                conn.Execute(tbsql);
    
                conn.Execute("drop table PeoCursor");
    
    
                List<peoTableInfo> pList = conn.Query<peoTableInfo>("select * from kb_People").ToList();

    用到的实体peoTableInfo:

    public class peoTableInfo
            {
                public peoTableInfo() { }
                public peoTableInfo(string ID,string Name,string UserName,string PassWord,string PeoTypeID)
                {
                    this.ID = ID;
                    this.Name = Name;
                    this.UserName = UserName;
                    this.PassWord = PassWord;
                    this.PeoTypeID = PeoTypeID;
                }
                public string ID { get; set; }
                public string Name { get; set; }
                public string UserName { get; set; }
                public string PassWord { get; set; }
                public string PeoTypeID { get; set; }
    
            }

    执行前:

    执行后:

    注意事项总结:

    创建的库表不得与当前库任一表重名,记得加一下判断。

    表结构必须一致。

    用完后记得删除表,以免造成脏数据。

    为什么不用临时表?----因为临时表创建后,使用时会面临找不到表的问题。坑太多,甚用。

     定期同步如何实现? ----代码扔进控制台程序中。生成exe然后去做windows计划任务。

  • 相关阅读:
    PAT 甲级 1126 Eulerian Path (25 分)
    PAT 甲级 1126 Eulerian Path (25 分)
    PAT 甲级 1125 Chain the Ropes (25 分)
    PAT 甲级 1125 Chain the Ropes (25 分)
    PAT 甲级 1124 Raffle for Weibo Followers (20 分)
    PAT 甲级 1124 Raffle for Weibo Followers (20 分)
    PAT 甲级 1131 Subway Map (30 分)
    PAT 甲级 1131 Subway Map (30 分)
    AcWing 906. 区间分组 区间贪心
    AcWing 907. 区间覆盖 区间贪心
  • 原文地址:https://www.cnblogs.com/JoeYD/p/15166831.html
Copyright © 2020-2023  润新知