采用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.pswp.cn/news/532405.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532405.shtml
英文地址,請注明出處:http://en.pswp.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;僅僅停留在 建庫、創表、增刪查改…