【优化】C#利用ODP.NET往oracle中高效插入百万数据
1.将字典Dictionary<string, object[]> 改为Dictionary<string, object>,如果是object[] 在调用时某些转换不了
2.将OracleDbType类型判断改为数组型
public class BatchHelper{private static readonly string ConnString = System.Configuration.ConfigurationManager.ConnectionStrings["MDBSConnString"].ConnectionString;/// <summary>/// 批量插入数据/// </summary>/// <param name="tableName"> 表名称 </param>/// <param name="columnRowData"> 键-值存储的批量数据:键是列名称,值是该列对应的数据集合 </param>/// <returns></returns>public static int BatchInsert(string tableName, Dictionary<string, object> columnRowData, int length){if (string.IsNullOrEmpty(tableName)){throw new ArgumentNullException("tableName", "必须指定批量插入的表名称");}if (columnRowData == null || columnRowData.Count < 1){throw new ArgumentException("必须指定批量插入的字段名称", "columnRowData");}int iResult = 0;string[] dbColumns = columnRowData.Keys.ToArray();StringBuilder sbCmdText = new StringBuilder();if (columnRowData.Count > 0){// 准备插入SQLsbCmdText.AppendFormat("INSERT INTO {0} (", tableName);sbCmdText.Append(string.Join(",", dbColumns));sbCmdText.Append(") VALUES (");sbCmdText.Append(":" + string.Join(", :", dbColumns));sbCmdText.Append(") ");using (OracleConnection conn = new OracleConnection(ConnString)){using (OracleCommand cmd = conn.CreateCommand()){conn.Open();// 绑定批处理的行数cmd.ArrayBindCount = length; //columnRowData.Values.First().Length; // 很重要cmd.BindByName = true;cmd.CommandType = CommandType.Text;cmd.CommandText = sbCmdText.ToString();cmd.CommandTimeout = 600; // 10分钟// 创建参数 OracleParameter oraParam;OracleDbType dbType = OracleDbType.Object;foreach (string colName in dbColumns){dbType = GetOracleDbType(columnRowData[colName]);oraParam = new OracleParameter(colName, dbType);oraParam.Direction = ParameterDirection.Input;oraParam.OracleDbTypeEx = dbType;oraParam.Value = columnRowData[colName];cmd.Parameters.Add(oraParam);}// 执行批处理var trans = conn.BeginTransaction();try{cmd.Transaction = trans;iResult = cmd.ExecuteNonQuery();trans.Commit();}catch (Exception dbex){trans.Rollback();throw dbex;}}}}return iResult;}/// 批量更新数据/// </summary>/// <param name="tableName"> 表名称 </param>/// <param name="keyColumName"> 主键列名称 </param>/// <param name="columnRowData"> 键-值存储的批量数据:键是列名称,值是该列对应的数据集合 </param>/// <returns></returns>public static int BatchUpdate(string tableName, string keyColumName, Dictionary<string, object[]> columnRowData){if (string.IsNullOrEmpty(tableName)){throw new ArgumentNullException("tableName", "必须指定批量插入的表名称");}if (string.IsNullOrEmpty(tableName)){throw new ArgumentNullException("keyColumName", "必须指定批量插入表的主键列名称");}if (columnRowData == null || columnRowData.Count < 1){throw new ArgumentException("必须指定批量插入的字段名称", "columnRowData");}int iResult = 0;string[] dbColumns = columnRowData.Keys.ToArray();StringBuilder sbCmdText = new StringBuilder();if (columnRowData.Count > 0){// 准备更新SQLsbCmdText.AppendFormat("update {0} set ", tableName);foreach (var col in dbColumns){if (keyColumName.Equals(col, StringComparison.OrdinalIgnoreCase)){continue;}sbCmdText.AppendFormat("{0} = :{0} ,", col);}sbCmdText.Remove(sbCmdText.Length - 1, 1);sbCmdText.AppendFormat(" where {0} = :{0}", keyColumName);using (OracleConnection conn = new OracleConnection(ConnString)){using (OracleCommand cmd = conn.CreateCommand()){conn.Open();// 绑定批处理的行数cmd.ArrayBindCount = columnRowData.Values.First().Length; // 很重要cmd.BindByName = true;cmd.CommandType = CommandType.Text;cmd.CommandText = sbCmdText.ToString();cmd.CommandTimeout = 600; // 10分钟// 创建参数 OracleParameter oraParam;List<IDbDataParameter> cacher = new List<IDbDataParameter>();OracleDbType dbType = OracleDbType.Object;foreach (string colName in dbColumns){dbType = GetOracleDbType(columnRowData[colName][0]);oraParam = new OracleParameter(colName, dbType);oraParam.Direction = ParameterDirection.Input;oraParam.OracleDbTypeEx = dbType;oraParam.Value = columnRowData[colName];cmd.Parameters.Add(oraParam);}// 执行批处理var trans = conn.BeginTransaction();try{cmd.Transaction = trans;iResult = cmd.ExecuteNonQuery();trans.Commit();}catch (Exception dbex){trans.Rollback();throw dbex;}}}}return iResult;}/// <summary>/// 根据数据类型获取OracleDbType/// </summary>/// <param name="value"></param>/// <returns></returns>private static OracleDbType GetOracleDbType(object value){OracleDbType dataType = OracleDbType.Object;if (value is string[]){dataType = OracleDbType.Varchar2;}else if (value is DateTime[]){dataType = OracleDbType.TimeStamp;}else if (value is int[] || value is short[]){dataType = OracleDbType.Int32;}else if (value is long[]){dataType = OracleDbType.Int64;}else if (value is decimal[] || value is double[]){dataType = OracleDbType.Decimal;}else if (value is Guid[]){dataType = OracleDbType.Varchar2;}else if (value is bool[] || value is Boolean[]){dataType = OracleDbType.Byte;}else if (value is byte[]){dataType = OracleDbType.Blob;}else if (value is char[]){dataType = OracleDbType.Char;}return dataType;}}
转载于:https://www.cnblogs.com/JiangXiaoTian/articles/3483647.html
【优化】C#利用ODP.NET往oracle中高效插入百万数据相关推荐
- oracle高效插入数据,Oracle:高效插入大量数据经验之谈
[IT168 评论]在很多时候,我们会需要对一个表进行插入大量的数据,并且希望在尽可能短的时间内完成该工作,这里,和大家分享下我平时在做大量数据insert的一些经验. 前提:在做insert数据之前 ...
- oracle模块损坏,Oracle中模拟及修复数据块损坏
Oracle中模拟及修复数据块损坏,itpub link: http://www.itpub.net/showthread.php?threadid=201766[@more@]Oracle中模拟及修 ...
- SQL语句oracle中如何插入Date类型的数据
在开发的时候,经常要写条SQL语句将信息插入表中,插入的数据如果字段是date类型,就必须将date类型转换成字符串String类型在通过sql语句插入数据库.这是我字段唯一的方法,如果有高人请另赐教 ...
- 【Python数据分析】利用Python删除EXCEL表格中指定的列数据或行数据
如何利用Python删除EXCEL表格中指定的列数据?今天与大家一起分享一下DataFrame对象的drop()函数,drop()函数可根据标签删除EXCEL表格中的列数据或行数据,其语法格式如下: ...
- oracle+循环插入sql,SQL server,Oracle循环插入百万数据
SQL server,Oracle循环插入百万数据 SQL server,Oracle循环插入百万数据 压测时常需要往数据库插入大量数据,下面是我往两个数据库插入数据时用的脚本 declare @ma ...
- ORACLE中高效SQL的写法
目录 1. 书写格式规范 1-1.大小文字及空格的统一 1-2.日期格式明确化 1-3.Bind变量的使用 1-4.表别名的使用 1-5.检索时尽量避免检索不需要的列 1-6.ORDER ...
- Oracle中如何删除重复数据
我们可能会出现这种情况,某个表原来设计不周全,导致表里面的数据数据重复,那么,如何对重复的数据进行删除呢? 重复的数据可能有这样两种情况,第一种时表中只有某些字段一样,第二种是两行记录完全一样. 一. ...
- oracle查询多张表交集,Oracle中对两个数据表交集的查询-专栏,ORACLE
oracle关系型管理系统是世界上流行的关系,它是一个极其强悍.灵活和复杂的系统,据说,在使用oracle时应有这样的观念,那就是在sql中近乎可以推动任何一种想法. 下面向你们介绍使用sql查两个o ...
- Oracle中如何插入特殊字符: 和 ' (多种解决方案)
http://www.blogjava.net/pengpenglin/archive/2008/01/16/175689.html 今天在导入一批数据到Oracle时,碰到了一个问题:Toad提示要 ...
最新文章
- php判断值是否为空
- AI在管理临床试验设计和执行中,人和机器还在学习曲线上?
- sql server 数据库 ' ' 附近有语法错误
- You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE)
- MySQL主从复制虽好,能完美解决数据库单点问题吗?
- php atlas,apache atlas是什么
- python二分法查找数字_Python——二分法查找
- linux 网卡命令 mtu,Linux网络命令
- java第三方包学习之jsoup
- 网页内容变化监控提醒
- POSTMAN接口测试流程
- 交换机连接路由器计算机联网,交换机上连接路由器_连上路由器(交换器)后部分电脑无法上网的解决方法_交换机上接路由器...
- VMware Workstation未能挂起虚拟机
- 【Linux】gcc/g++区别和联系
- axios和layUI配合加载数据表格demo
- 遇到空指针异常的时候我们应该怎么办
- 海外并购不失为好时机
- mars3d学习-方量分析
- 该爬破解验证码,爬企信宝必须破解滑块验证
- 流媒体服务器(1)—— 一个非常好用云转码流媒体平台