做ETL的时候用到的数据同步更新代码

这里是用的从一个库同步到另一个库,代码如下

        private void IncrementalSyncUpdate(string fromConn, string toConn, Dictionary<string, string> sqlList)
        {
            var sw = new Stopwatch();

            using (var conn = new SqlConnection(fromConn))
            {
                if (conn.State != ConnectionState.Open) conn.Open();

                using (var cmd = new SqlCommand())
                {
                    try
                    {
                        foreach (var item in sqlList)
                        {
                            var sql = item.Value;

                            var tableName = item.Key;

                            sw.Restart();

                            cmd.CommandText = sql;
                            cmd.CommandType = CommandType.Text;
                            cmd.Connection = conn;

                            DataTable dt = new DataTable();

                            SqlDataAdapter sda = new SqlDataAdapter(cmd);

                            sda.Fill(dt);

                            if (dt.Rows.Count == 0) continue;//如果没有新增数据,跳过

                            foreach (DataRow row in dt.Rows)
                            {
                                row.SetModified();
                            }

                            int updateCount = 0;

                            using (var TmpConn = new SqlConnection(toConn))
                            {
                                if (TmpConn.State != ConnectionState.Open) TmpConn.Open();

                                using (var tmpCmd = new SqlCommand())
                                {
                                    tmpCmd.CommandText = "select * from Meb_" + tableName;
                                    tmpCmd.CommandType = CommandType.Text;
                                    tmpCmd.Connection = TmpConn;
                                    SqlDataAdapter tmpSda = new SqlDataAdapter(tmpCmd);

                                    SqlCommandBuilder scb = new SqlCommandBuilder(tmpSda);
                                    tmpSda.UpdateCommand = scb.GetUpdateCommand();
                                    updateCount = tmpSda.Update(dt);

                                }
                            }

                            sw.Stop();

                            Console.WriteLine("增量同步数据更新完成,表名:{0},数据{1}条,耗时{2}秒", tableName, updateCount, sw.Elapsed.TotalSeconds);
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine("增量同步数据同步更新失败," + e.ToString());
                    }
                }
            }
        }

这个sqllist是一个   Key:表名  Value:查询SQL  ,做增量同步查询的,主要根据时间戳来获取时间。

用SqlAdapter的Update方法来做更新,这里有个问题,在更新的DataTable里面的数据要对DataRow的RowState进行一个设置,如果是未设置,那么Update过后,数据库是没有变化的。

时间: 2024-09-29 21:54:31

做ETL的时候用到的数据同步更新代码的相关文章

[db2数据库数据同步解决方案]DB2数据库数据同步更新方法及设备与流程

技术总结 本发明实施例提供了DB2数据库数据同步更新方法及设备.所述方法包括:根据待同步更新表创建数据详细地址存储列,对待同步更新表上S锁,获取源端DB2数据库当前的日志序列号LSN作为待同步更新表的起始LSN,释放S锁:获取待同步更新表的结果集,将结果集发送至目标端数据库入库,获取源端DB2数据库当前LSN作为待同步更新表的结束LSN:接收源端同步更新服务发送的初始化数据,在目标端数据库将ROWID插入数据详细地址存储列,初始化待同步更新表的数据:启动数据实时同步更新服务,将源端DB2数据库的

[转]实现Hive数据同步更新的shell脚本

引言: 上一篇文章<Sqoop1.4.4 实现将 Oracle10g 中的增量数据导入 Hive0.13.1 ,并更新Hive中的主表>http://www.linuxidc.com/Linux/2014-09/106282.htm描述了增量更新Hive表的原理和Sqoop,Hive命令,本文基于上一篇文章的内容实现了shell脚本的编写,稍加修改就可用于实际工程. shell脚本 #!/bin/bash #Please set the synchronize interval,unit is

【甘道夫】实现Hive数据同步更新的shell脚本

引言: 上一篇文章<[甘道夫]Sqoop1.4.4 实现将 Oracle10g 中的增量数据导入 Hive0.13.1 ,并更新Hive中的主表>http://blog.csdn.net/u010967382/article/details/38735381 描述了增量更新Hive表的原理和Sqoop,Hive命令,本文基于上一篇文章的内容实现了shell脚本的编写,稍加修改就可用于实际工程. ***欢迎转载,请注明来源***    http://blog.csdn.net/u01096738

【转】mysql 触发器实现两个表的数据同步

mysql通过触发器实现两个表的同步 目前,在本地测试成功. 假设本地的两个数据库a和b,a下有表table1(id, val) b下有表table2(id, val) 假设希望当table1中数据更新,table2中数据同步更新. 代码: DELIMITER $$ CREATE /*[DEFINER = { user | CURRENT_USER }]*/ TRIGGER `a`.`触发器名` BEFORE UPDATE ON `a`.`table1` FOR EACH ROW BEGIN I

Salesforce 如何把签卡数据同步到中控系统

一.考勤界面 二.分析 1)同步数据首先要得到数据,如何得到数据呢? 第一步:创建签卡数据的触发器 第二步:创建同步日志类,把所有的签卡信息都添加到同步日志里 2)从数据源得到数据后以Json格式传递 3)创建一个SpringMVC的Maven工程, a.以阿里巴巴的Druid配置数据源, b.创建个定时器,每隔一分钟从Salesforce的日志里读取信息 c.在Dao层里写数据同步的代码 d.测试 三.同步示意图: 四.触发器代码: trigger attendanceSyncTrigger

数据库中两张表之间的数据同步实现思路(增加、删除、更新)Mysql、sqlserver

分别创建增加.删除.更新的触发器(Trigger)来达到两张表之间数据同步的目的. 1:数据同步增加:如有两张表--A表和B表,创建触发器使当A表插入数据后B表也同步插入数据.其中B表插入数据的字段需要同A表中的字段相对应. CREATE TRIGGER 触发器名称 ON A表 AFTER INSERT AS BEGIN INSERT INTO B表(B表字段1,B表字段2,B表字段3) SELECT A表字段1,A表字段2,A表字段3 FROM INSERTED END 2.数据同步删除:如有

使用navicat比对两个mysql数据库表结构,并做数据同步

摘要:开发提出需求,要把线上数据库环境导出一份到测试数据库,并数据结构同步,不能丢失表结构,表数据. 1.选择 工具>结构同步> 2.如图所示分别选择两个数据库,点击比对 注意:先做结构对比,在要覆盖数据的数据库中,找出不同表做备份,整体数据库做备份,方便出错后能回滚.然后再做数据同步,数据传输就是真正把两个数据库中数据合并了. 3,数据结构对比后记得做数据同步预览,避免有错误. 原文地址:https://www.cnblogs.com/llody/p/12052844.html

关于数据同步的几种实现第五种基于软件应用程序进行同步(前四种基于数据库级,第四种做集群一主多从。)

之前网络上收集到的一些关于数据同步的资料 一通过发布/订阅的方式实现同步 发布/订阅是Sql Server自带的一种数据库备份的机制,通过该机制可以快速的实现数据的备份同步,不用编写任何的代码. 此种数据同步的方式存在的以下的一些问题: 表结构不能更改,同步双方的表结构必须一致,一旦表结构发生更改需要重新生成数据库快照. 对于大数据量的同步没有可靠的保证. 网络不稳定的情况下同步也不能保证. 总的来说,这种数据备份同步的方式,在表结构一致.数据量不是特别大的情况下还是非常高效的一种同步方式. 二

ETL工具kettle怎么进行增量数据抽取:一、通过标志位

在平时的操作过程中可能大家需要经常进行增量的数据抽取,方法有很多种,接下来几天讲给大家介绍几种我本人经常使用的几种方式:首先给大家介绍我最喜欢的一种,就是通过标志位:操纵方法如下,在源表中增加一个标识字段,比如tongbu,当然可以为它设个默认值N,然后我们再增加一个索引nvl(tongbu,'N'),增加索引是为了提高查询的速度,接下来我们来写具体的流程:我写的这个流程非常简单,有的朋友们会非常疑惑为什么我会有更新组件,先卖个关子咱们继续:在写 表输入中的sql时,我们引入了一个伪列gx,并赋