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中高效插入百万数据相关推荐

  1. oracle高效插入数据,Oracle:高效插入大量数据经验之谈

    [IT168 评论]在很多时候,我们会需要对一个表进行插入大量的数据,并且希望在尽可能短的时间内完成该工作,这里,和大家分享下我平时在做大量数据insert的一些经验. 前提:在做insert数据之前 ...

  2. oracle模块损坏,Oracle中模拟及修复数据块损坏

    Oracle中模拟及修复数据块损坏,itpub link: http://www.itpub.net/showthread.php?threadid=201766[@more@]Oracle中模拟及修 ...

  3. SQL语句oracle中如何插入Date类型的数据

    在开发的时候,经常要写条SQL语句将信息插入表中,插入的数据如果字段是date类型,就必须将date类型转换成字符串String类型在通过sql语句插入数据库.这是我字段唯一的方法,如果有高人请另赐教 ...

  4. 【Python数据分析】利用Python删除EXCEL表格中指定的列数据或行数据

    如何利用Python删除EXCEL表格中指定的列数据?今天与大家一起分享一下DataFrame对象的drop()函数,drop()函数可根据标签删除EXCEL表格中的列数据或行数据,其语法格式如下: ...

  5. oracle+循环插入sql,SQL server,Oracle循环插入百万数据

    SQL server,Oracle循环插入百万数据 SQL server,Oracle循环插入百万数据 压测时常需要往数据库插入大量数据,下面是我往两个数据库插入数据时用的脚本 declare @ma ...

  6. ORACLE中高效SQL的写法

    目录 1.  书写格式规范  1-1.大小文字及空格的统一  1-2.日期格式明确化  1-3.Bind变量的使用  1-4.表别名的使用  1-5.检索时尽量避免检索不需要的列  1-6.ORDER ...

  7. Oracle中如何删除重复数据

    我们可能会出现这种情况,某个表原来设计不周全,导致表里面的数据数据重复,那么,如何对重复的数据进行删除呢? 重复的数据可能有这样两种情况,第一种时表中只有某些字段一样,第二种是两行记录完全一样. 一. ...

  8. oracle查询多张表交集,Oracle中对两个数据表交集的查询-专栏,ORACLE

    oracle关系型管理系统是世界上流行的关系,它是一个极其强悍.灵活和复杂的系统,据说,在使用oracle时应有这样的观念,那就是在sql中近乎可以推动任何一种想法. 下面向你们介绍使用sql查两个o ...

  9. Oracle中如何插入特殊字符: 和 ' (多种解决方案)

    http://www.blogjava.net/pengpenglin/archive/2008/01/16/175689.html 今天在导入一批数据到Oracle时,碰到了一个问题:Toad提示要 ...

最新文章

  1. php判断值是否为空
  2. AI在管理临床试验设计和执行中,人和机器还在学习曲线上?
  3. sql server 数据库 ' ' 附近有语法错误
  4. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE)
  5. MySQL主从复制虽好,能完美解决数据库单点问题吗?
  6. php atlas,apache atlas是什么
  7. python二分法查找数字_Python——二分法查找
  8. linux 网卡命令 mtu,Linux网络命令
  9. java第三方包学习之jsoup
  10. 网页内容变化监控提醒
  11. POSTMAN接口测试流程
  12. 交换机连接路由器计算机联网,交换机上连接路由器_连上路由器(交换器)后部分电脑无法上网的解决方法_交换机上接路由器...
  13. VMware Workstation未能挂起虚拟机
  14. 【Linux】gcc/g++区别和联系
  15. axios和layUI配合加载数据表格demo
  16. 遇到空指针异常的时候我们应该怎么办
  17. 海外并购不失为好时机
  18. mars3d学习-方量分析
  19. 该爬破解验证码,爬企信宝必须破解滑块验证
  20. 流媒体服务器(1)—— 一个非常好用云转码流媒体平台

热门文章

  1. Windows 安装 sbt
  2. shell进入特权模式_shell的各种运行模式?
  3. python多进程 保活_老板,你这个爬虫保活吗?
  4. 分布式系统监视zabbix讲解十之监控tomcat--技术流ken
  5. Derek解读Bytom源码-P2P网络 地址簿
  6. 部分xcode插件可能有新版本
  7. 第二次裸辞_潜伏期_一些感想
  8. samba在企业网应用
  9. C#控件及常用属性整理
  10. 开发人员的幸福:您需要知道的