采用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 ") -5);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(":{0}0", dt.Columns[i].ColumnName);}else{strInse.AppendFormat(":{0}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(cl.ColumnName+ "0", 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>
相关文章:
采用ODP.NET 批量进行数据同步
因开发、测试场景经常需要模拟机生产环境的数据,原同事开发了一个ado.net图形化同步工具,对非技术人员操作友好,但对技术员使用并不方便,每次同步需源库数据与目标的数据源字段进行配置,且同步大数据时慢,因…...
【vue滚动条插件vuescroll】【vue自定义滚动条】
文章目录 前言一、使用步骤1.下载2.引入库三、在组件中如何使用?四、跳转到顶部的方法scrollTo() 五、效果总结 前言 由于浏览器自带的滚动条比较不符合设计图,所以在大部分项目中,我们都会自定义滚动条的样式,来还原设计图&…...
python 1200例——【8】冒泡排序
冒泡排序是一种简单的排序算法,它重复地遍历待排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。 冒泡排序的代码: def bubble_sort(arr):n = len(arr)for i in range(n):#…...
在PyTorch中设置随机数生成器的种子值
在PyTorch中设置随机数生成器的种子值的方法 CPU:可以使用torch.manual_seed()函数 GPU:需要额外设置torch.cuda.manual_seed()来设置GPU上的随机数生成器种子值。 import torch# 设置随机种子 torch.manual_seed(0)if torch.cuda.is_available():tor…...
用手机做无人直播怎么做?
用手机进行无人直播已经成为了一种新兴的方式,给我们的生活带来了便利和创新。无人直播是指通过手机进行实时转播,而无需人工操作的一种直播形式。以下将介绍如何用手机实现无人直播。 首先,要实现手机无人直播,我们需要一个稳定…...
【zookeeper经典应用实战】
文章目录 Zookeeper主要方法 Zookeeper Java客户端实战 ZooKeeper应用的开发主要通过Java客户端API去连接和操作ZooKeeper集群。可供选择的Java客户 端API有: ZooKeeper官方的Java客户端API。 第三方的Java客户端API,比如Curator。 ZooKeeper官方的客户端…...
12月25日作业
串口发送控制命令,实现一些外设LED 风扇 uart4.c #include "uart4.h"void uart4_config() {//1.使能GPIOB\GPIOG\UART4外设时钟RCC->MP_AHB4ENSETR | (0x1 << 1);RCC->MP_AHB4ENSETR | (0x1 << 6);RCC->MP_APB1ENSETR | (0x1 <…...
React学习计划-React16--React基础(五)脚手架创建项目、todoList案例、配置代理、消息订阅与发布
一、使用脚手架create-react-app创建项目 react脚手架 xxx脚手架:用来帮助程序员快速创建一个基于xxx库的模板项目 包含了所有需要的配置(语法检查、jsx编译、devServe…)下载好了所有相关的依赖可以直接运行一个简单的效果 react提供了一个…...
C语言中switch语句中的case后()
基本格式 switch(表达式) { case整型数值1:语句1; ...... case整型数值n:语句n; default:语句n1; } 执行过程 计算“表达式”的值,假设为m从第一个case开始,比较“整型数值1”和m,如果相等,…...
【RocketMQ笔记02】安装RocketMQ可视化工具rocketmq-dashboard
这篇文章,主要介绍如何安装RocketMQ可视化工具rocketmq-dashboard。 目录 一、RocketMQ可视化界面 1.1、下载rocketmq-dashboard 1.2、修改配置文件 1.3、打包工程 1.4、启动rocketmq-dashboard 一、RocketMQ可视化界面 1.1、下载rocketmq-dashboard rocketm…...
AutoSAR(基础入门篇)2.2-AutoSAR架构中的Ports类型与Runnables可运行实体
Ports的类型 一、接口的类型 1、S/R接口 2、C/S接口 Runnables可运行实体...
【Unity】GPU骨骼动画 渲染性能开挂 动画合批渲染 支持武器挂载
GPU骨骼动画视频介绍: GPU顶点动画和GPU骨骼动画实现原理及优缺点对比 性能优化 GPU动画是实现万人同屏的前置条件,在之前的文章中已介绍过GPU顶点动画的实现方法:【Unity】渲染性能开挂GPU Animation, 动画渲染合批GPU Instance_skinmeshren…...
打开相机失败 出现错误的原因
如何解决? Debug中缺少DLL文件 以下参考周姐文档 相机调用步骤 学习相机第三方库的安装 https://blog.csdn.net/Qingshan_z/article/details/117257136书签:QT添加库(静态库和动态库)_Qingshan_z的博客-CSDN博客_qt添加库 添加文…...
什么是阿里云负载均衡SLB?
目录 硬件或软件负载均衡的区别是什么? 什么是阿里云负载均衡SLB? 阿里云传统型负载均衡CLB 硬件或软件负载均衡的区别是什么? 通过专用硬件实现负载均衡,那么整体成本会较高,而且设备容易出现单点故障,…...
Mybatis三 | 动态SQL
目录 if where set ctrl alt l格式化SQL语句 随着用户的输入或外部条件的变化而变化的SQL称为动态SQL if <if>用来判断条件是否成立,使用test属性进行条件判断,如果true,则拼接SQL where wehre元素只会在有条件成立的情况下才插入…...
信号与槽QT4和QT5的区别
信号与槽QT4和QT5的区别 Qt4 connect(btn, SIGNAL(clicked()), this, SLOT(close()));在 Qt 4 中,信号和槽的连接使用了一种不同的语法,这是 Qt 框架特有的,利用了 Qt 的元对象系统(Meta-Object System)。Qt 4 中连接…...
K8S 搜集java应用pod重启前现场 —— 筑梦之路
JAVA技术广泛用于各行各业,而云原生的流行,越来越多的企业将java应用搬进K8S中进行部署管理,OOM是java应用比较常出现的故障问题,对于容器环境的java应用搜集OOM等现场比较有难度,为了持续对应用的优化,搜集…...
php5.6安装mongo扩展
需要依赖 可以参考 php5.6安装openssl扩展 https://pecl.php.net/package/mongo 安装mongo扩展 wget https://pecl.php.net/get/mongo-1.6.16.tgz/Users/hina/Applications/php/5.6.40/bin/phpize./configure --with-php-config/Users/hina/Applications/php/5.6.40/bin/ph…...
简析SoBit 跨链桥图文教程
从BTC网络到Solana网络桥接BRC20 1.打开SoBit平台:在您的网络浏览器中启动SoBit Bridge应用程序。 2.连接您的钱包: 选择SoBit界面右上角的比特币网络来连接您的数字钱包。 3.选择源链、目标链和您想桥接的代币: 从下拉菜单中选择’BTC’作为…...
C#与php自定义数据流传输
C#与php自定义数据流传输 介绍一、客户端与服务器数据传输流程图客户端发送数据给服务器:服务器返回数据给客户端: 二、自定义数据流C#版本数据流PHP版本数据流 三、数据传输测试1.在Unity中创建一个C#脚本NetWorkManager.cs2.服务器www目录创建StreamTe…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
