采用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…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...
阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)
cd /home 进入home盘 安装虚拟环境: 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境: virtualenv myenv 3、激活虚拟环境(激活环境可以在当前环境下安装包) source myenv/bin/activate 此时,终端…...
