采用ODP.NET 批量进行数据同步

因开发、测试场景经常需要模拟机生产环境的数据,原同事开发了一个ado.net图形化同步工具,对非技术人员操作友好,但对技术员使用并不方便,每次同步需源库数据与目标的数据源字段进行配置,且同步大数据时慢,因此抽空自己写了简单的同步工具,极大提高了效率。直接贴代码如下:

using System;
using System.Collections.Generic;
using System.Data;
using System.Text;
using Oracle.ManagedDataAccess.Client;
namespace SyncData
{class Program{static void Main(string[] args){//原库连接string strConnSource = System.Configuration.ConfigurationManager.ConnectionStrings["SourceConnectionString"].ConnectionString;//目标连接string strConnTarget = System.Configuration.ConfigurationManager.AppSettings["ConnectionString"];//同步方案string[] SyschSchemes = System.Configuration.ConfigurationManager.AppSettings["SyschScheme"].Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);OracleConnection conn = null;List<string> list = new List<string>();Console.WriteLine("------准备导入----------------");try{using (conn = new OracleConnection(strConnSource)){for (int i = 0; i < SyschSchemes.Length; i++){string strSql = SyschSchemes[i].ToLower();string strSqlO = SyschSchemes[i];if (strSql.Trim().Length == 0){continue;}string tb = strSql.Substring(strSql.IndexOf("from") + 4, strSql.IndexOf("where") - strSql.IndexOf("from") - 4);using (OracleCommand cmd = conn.CreateCommand()){cmd.CommandText = strSqlO;cmd.CommandType = CommandType.Text;OracleDataAdapter oracleDataAdapter = new OracleDataAdapter(cmd);DataTable dt = new DataTable(tb);oracleDataAdapter.Fill(dt);Console.WriteLine(tb + "共:" + dt.Rows.Count + "条");if (dt.Rows.Count == 0)continue;//暂停该表所有触发器string trigerN =string.Format("alter table {0}  disable all triggers",tb);string trigerY = string.Format("alter table {0}  enable all triggers", tb);string deleteSql = string.Format("delete from  {0}", strSqlO.Substring(strSql.IndexOf("from") + 4));//暂停目标表触发器executeSQL(strConnTarget, trigerN);//删除目标表条件数据executeSQL(strConnTarget, deleteSql);//同步至目标表InsertData(strConnTarget,dt);//启用触发器executeSQL(strConnTarget, trigerY);}}}}catch (Exception ex){Console.WriteLine(ex.Message);}finally{if (conn != null && conn.State == ConnectionState.Open){conn.Close();}}Console.Read();}private static void InsertData(string strConnTarget, DataTable dt){OracleConnection conn = null;StringBuilder strInse = new StringBuilder();Dictionary<string, List<object>> listData = new Dictionary<string, List<object>>();strInse.AppendFormat("insert into {0} (", dt.TableName);for (int i = 0; i < dt.Columns.Count; i++){if (i == dt.Columns.Count - 1){strInse.AppendFormat("\"{0}\"", dt.Columns[i].ColumnName);}else{strInse.AppendFormat("\"{0}\",", dt.Columns[i].ColumnName);}listData.Add(dt.Columns[i].ColumnName, new List<object>());}strInse.AppendFormat(")values(");for (int i = 0; i < dt.Columns.Count; i++){if (i == dt.Columns.Count - 1){strInse.AppendFormat(":v_{0}", dt.Columns[i].ColumnName);}else{strInse.AppendFormat(":v_{0},", dt.Columns[i].ColumnName);}}strInse.AppendFormat(")");foreach (DataRow row in dt.Rows){foreach (DataColumn cl in dt.Columns){listData[cl.ColumnName].Add(row[cl.ColumnName]);}}try{using (conn = new OracleConnection(strConnTarget)){using (OracleCommand cmd = conn.CreateCommand()){cmd.CommandText = strInse.ToString();cmd.CommandType = CommandType.Text;cmd.ArrayBindCount = dt.Rows.Count;cmd.BindByName = true;OracleDbType dbType = OracleDbType.Varchar2;OracleParameter oraParam;foreach (DataColumn cl in dt.Columns){dbType = GetOracleDbType(cl.DataType);oraParam = new OracleParameter("v_"+cl.ColumnName, dbType);oraParam.Direction = ParameterDirection.Input;oraParam.OracleDbTypeEx = dbType;oraParam.Value = listData[cl.ColumnName].ToArray();cmd.Parameters.Add(oraParam);}conn.Open();int result = cmd.ExecuteNonQuery();Console.WriteLine(dt.TableName + "同步完成" + result + "条!");}}}catch (Exception ex){Console.WriteLine(dt.TableName+"产生错误:"+ex.Message);}finally{if (conn != null && conn.State == ConnectionState.Open){conn.Close();}}}private static void executeSQL(string strConnTarget, string strSql){OracleConnection conn = null;try{using (conn = new OracleConnection(strConnTarget)){using (OracleCommand cmd = conn.CreateCommand()){cmd.CommandText = strSql;cmd.CommandType = CommandType.Text;conn.Open();int result = cmd.ExecuteNonQuery();}}}catch (Exception ex){Console.WriteLine("产生错误:" + ex.Message+ex.StackTrace);}finally{if (conn != null && conn.State == ConnectionState.Open){conn.Close();}}}private static OracleDbType GetOracleDbType(Type o){switch (o.Name){case "String":return OracleDbType.Varchar2;case "DateTime":return OracleDbType.Date;case "Int64":return OracleDbType.Int64;case "Int32":return OracleDbType.Int32;case "Int16":return OracleDbType.Int16;case "Decimal":return OracleDbType.Decimal;case "Double":return OracleDbType.Double;case "Blob":return OracleDbType.Blob;case "Clob":return OracleDbType.Clob;case "Byte[]":return OracleDbType.Blob;case "Single":return OracleDbType.Single;default:return OracleDbType.Varchar2;}}}
}

app.config进行数据源库、同步目标库、同步表 配置

  <connectionStrings><!--数据源链接--><add name="SourceConnectionString" connectionString=""/></connectionStrings><appSettings><!--目标数据库链接--><!--测试库--><add key="ConnectionString" value=""/><!--同步表--><add key="SyschScheme"value=" 
select * from testa where create_time>sysdate-10; 
select a,b,b,c,d,f from testb where 1=1; 
"/></appSettings>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532405.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

熔断器熔断时间标准_一种熔断器熔断时间测试电路的制作方法

本实用新型涉及汽车制造技术领域&#xff0c;尤其涉及一种熔断器熔断时间测试电路。背景技术&#xff1a;伴随着日新月异的科技进步&#xff0c;人们对生活质量的追求也越来越高&#xff0c;汽车已经成为人们日常出行必不可少的交通工具&#xff0c;人们对汽车的舒适性、安全性…

DETR精读笔记

DETR精读笔记 论文&#xff1a;End-to-End Object Detection with Transformers &#xff08;发表于 ECCV-2020&#xff09; 代码&#xff1a;https://github.com/facebookresearch/detr 解读视频&#xff1a;DETR 论文精读【论文精读】 本笔记主要基于 Yi Zhu 老师的解读 引言…

lcd像素点密度_【教程】设置添加LCD密度(DPI)设置

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼完美—————————————————分割————————————————————————反编译settings.apk(1.52)1.Settings.apk\res\values\arrays.xml在之前加入以下代码240242244246248250252254256258260262264266268…

GAN网络评估指标:IS、FID、PPL

GAN网络评估指标&#xff1a;IS、FID、PPL 转自&#xff1a;IS、FID、PPL&#xff0c;GAN网络评估指标 另外关于GAN的评价指标&#xff0c;推荐李宏毅老师的视频&#xff1a;【機器學習2021】生成式對抗網路 (Generative Adversarial Network, GAN) (三) – 生成器效能評估與條…

降维后输入分类器分类时报错_逻辑回归解决多分类方法及其优缺点分析

众所周知&#xff0c;逻辑回归常用于解决二分类任务&#xff0c;但是在工作/学习/项目中&#xff0c;我们也经常要解决多分类问题。本文总结了 3 种逻辑回归解决多分类的方法&#xff0c;并分析了他们的优缺点。一、One-Vs-Rest假设我们要解决一个分类问题&#xff0c;该分类问…

浅谈 PyTorch 中的 tensor 及使用

浅谈 PyTorch 中的 tensor 及使用 转自&#xff1a;浅谈 PyTorch 中的 tensor 及使用 这篇文章主要是围绕 PyTorch 中的 tensor 展开的&#xff0c;讨论了张量的求导机制&#xff0c;在不同设备之间的转换&#xff0c;神经网络中权重的更新等内容。面向的读者是使用过 PyTorch …

简述springmvc过程_spring mvc的工作流程是什么?

展开全部SpringMVC工作流程描述向服务器发送HTTP请求&#xff0c;请求被前端控制器 DispatcherServlet 捕获。DispatcherServlet 根据 -servlet.xml 中的配置对请62616964757a686964616fe59b9ee7ad9431333365646233求的URL进行解析&#xff0c;得到请求资源标识符(URI)。 然后根…

PyTorch 的 Autograd

PyTorch 的 Autograd 转自&#xff1a;PyTorch 的 Autograd PyTorch 作为一个深度学习平台&#xff0c;在深度学习任务中比 NumPy 这个科学计算库强在哪里呢&#xff1f;我觉得一是 PyTorch 提供了自动求导机制&#xff0c;二是对 GPU 的支持。由此可见&#xff0c;自动求导 (a…

商场楼层导视牌图片_百宝图商场电子导视软件中预约产品功能简介

百宝图商场电子导视软件中预约产品功能简介 管理端&#xff0c;可配合百宝图商场电子导视软件配套使用 1&#xff1a;数据展示&#xff1a;图形展示总预约数/预约时间峰值/预约途径/各途径数量对比 2&#xff1a;数据统计&#xff1a;有效预约数量/无效预约数量/无效预约原因备…

Pytorch autograd.grad与autograd.backward详解

Pytorch autograd.grad与autograd.backward详解 引言 平时在写 Pytorch 训练脚本时&#xff0c;都是下面这种无脑按步骤走&#xff1a; outputs model(inputs) # 模型前向推理 optimizer.zero_grad() # 清除累积梯度 loss.backward() # 模型反向求导 optimizer.step()…

相对熵与交叉熵_熵、KL散度、交叉熵

公众号关注 “ML_NLP”设为 “星标”&#xff0c;重磅干货&#xff0c;第一时间送达&#xff01;机器学习算法与自然语言处理出品公众号原创专栏作者 思婕的便携席梦思单位 | 哈工大SCIR实验室KL散度 交叉熵 - 熵1. 熵(Entropy)抽象解释&#xff1a;熵用于计算一个随机变量的信…

动手实现一个带自动微分的深度学习框架

动手实现一个带自动微分的深度学习框架 转自&#xff1a;Automatic Differentiation Tutorial 参考代码&#xff1a;https://github.com/borgwang/tinynn-autograd (主要看 core/tensor.py 和 core/ops.py) 目录 简介自动求导设计自动求导实现一个例子总结参考资料 简介 梯度…

git安装后找不见版本_结果发现git版本为1.7.4,(git --version)而官方提示必须是1.7.10及以后版本...

结果发现git版本为1.7.4,(git --version)而官方提示必须是1.7.10及以后版本升级增加ppasudo apt-add-repository ppa:git-core/ppasudo apt-get updatesudo apt-get install git如果本地已经安装过Git&#xff0c;可以使用升级命令&#xff1a;sudo apt-get dist-upgradeapt命令…

随机数生成算法:K进制逐位生成+拒绝采样

随机数生成算法&#xff1a;K进制逐位生成拒绝采样 转自&#xff1a;【宫水三叶】k 进制诸位生成 拒绝采样 基本分析 给定一个随机生成 1 ~ 7 的函数&#xff0c;要求实现等概率返回 1 ~ 10 的函数。 首先需要知道&#xff0c;在输出域上进行定量整体偏移&#xff0c;仍然满…

深入理解NLP Subword算法:BPE、WordPiece、ULM

深入理解NLP Subword算法&#xff1a;BPE、WordPiece、ULM 本文首发于微信公众号【AI充电站】&#xff0c;感谢大家的赞同、收藏和转发(▽) 转自&#xff1a;深入理解NLP Subword算法&#xff1a;BPE、WordPiece、ULM 前言 Subword算法如今已经成为了一个重要的NLP模型性能提升…

http 错误 404.0 - not found_电脑Regsvr32 用法和错误消息的说明

​ 对于那些可以自行注册的对象链接和嵌入 (OLE) 控件&#xff0c;例如动态链接库 (DLL) 文件或 ActiveX 控件 (OCX) 文件&#xff0c;您可以使用 Regsvr32 工具 (Regsvr32.exe) 来将它们注册和取消注册。Regsvr32.exe 的用法RegSvr32.exe 具有以下命令行选项&#xff1a; Regs…

mysql error 1449_MySql错误:ERROR 1449 (HY000)

笔者系统为 mac &#xff0c;不知怎的&#xff0c;Mysql 竟然报如下错误&#xff1a;ERROR 1449 (HY000): The user specified as a definer (mysql.infoschemalocalhost) does not exist一时没有找到是什么操作导致的这个错误。然后经过查询&#xff0c;参考文章解决了问题。登…

MobileNet 系列:从V1到V3

MobileNet 系列&#xff1a;从V1到V3 转自&#xff1a;轻量级神经网络“巡礼”&#xff08;二&#xff09;—— MobileNet&#xff0c;从V1到V3 自从2017年由谷歌公司提出&#xff0c;MobileNet可谓是轻量级网络中的Inception&#xff0c;经历了一代又一代的更新。成为了学习轻…

mysql 查询表的key_mysql查询表和字段的注释

1,新建表以及添加表和字段的注释.create table auth_user(ID INT(19) primary key auto_increment comment 主键,NAME VARCHAR(300) comment 姓名,CREATE_TIME date comment 创建时间)comment 用户信息表;2,修改表/字段的注释.alter table auth_user comment 修改后的表注…

mysql 高级知识点_这是我见过最全的《MySQL笔记》,涵盖MySQL所有高级知识点!...

作为运维和编程人员&#xff0c;对MySQL一定不会陌生&#xff0c;尤其是互联网行业&#xff0c;对MySQL的使用是比较多的。MySQL 作为主流的数据库&#xff0c;是各大厂面试官百问不厌的知识点&#xff0c;但是需要了解到什么程度呢&#xff1f;仅仅停留在 建库、创表、增删查改…