各种数据库的批量插入操作_Oracle
最近工作中需要优化以前各种的Excel批量导入功能,目前将能优化的方面做个记录。
选用技术:
目前.Net可以访问Oracle常用的Dll,有三种:
- 微软自带的 System.Data.OracleClient
- Oracle 公司提供的 Oracle.DataAccess
- System.Data.OleDb
通过比对以后,使用第二种,其原因如下:
访问数据库方式 | 优点 | 缺点 |
System.Data.OracleClient | 操作简单,无论32,64直接引用即可使用 | 微软在4.0之后不会对其更新,而且不支持批量操作,批量操作万级别的数据,非常的慢 |
OracleDataAccess | 对数据库的操作非常的快,批量操作1w的数据速度在3秒内 | 引用需要分 32 64。且不太容易控制,如果不慎重,经常会出现无法找到该dll的Bug |
System.Data.OleDb | 已经Pass不适用 | 已经Pass不适用 |
下载所需DLL Oracle.DataAccess
首先上官方的介绍: 官方首页
其中对Oracle.DataAccess之前一直需要区别32位和64位版本。而且一直比较容易出错。
因为Oracle.DataAccess分非托管代码,和托管代码,非托管代码会编译成机器码,而不是.net bytes[]。所以没办法实现类似于any cpu的功能。
后续Oracle 发布了托管代码dll, Oracle.ManagedDataAccess。 引用该dll,将不需要明显的判断32位以及64位:
ex: 比如在客户端上调试的时候是32位的机器,引用了32位的Oracle.DataAccess。当发布到服务器端的时候需要64位的环境,则需要手工替换成 64位的dll。
其中托管dll 和非托管dll 中间的差异非常小,只有极个别不太常用的功能不同。所以建议程序中尽量使用 Oracle.ManagedDataAccess
使用步骤:
1: 下载对应的版本的ODP.Net
备注下这里Oracle 的组件解释:
Oracle Data Access Components (ODAC)
Oracle Developer Tools for Visual Studio (ODT)
Oracle Data Provider for .NET (ODP.NET)
其中ODAC包含ODP.Net 其在使用Oracle 的EntityFramwork时需要使用, ODT 是为了在.net 环境中设置 Oracle 数据源用的。
进入Oracle .Net下载中心,选择对应的版本 其中带有Manager的Dll 就是托管类。
2: 批量调用 :
其中关键的代码都已经贴出来了。如果各位有更好的意见,可以写在评论里。
string sql = string.Empty;OracleCommand com = con.CreateCommand();com.CommandText = sql;com.Transaction = tra;#region keywordvar dataCount = mediaBuyIdKeywords.SelectMany(n => n.Value).Count();com.ArrayBindCount = dataCount;com.Transaction = tra;var allKeyWords = mediaBuyIdKeywords.SelectMany(n => n.Value).ToList();sql = @"INSERT INTO KEYWORD(KEYWORD_ID,SITE_ID,KEYWORD_NAME,STATUS,SOURCE,CREATE_TIME,LAST_CHANGED)VALUES(KEYWORD_SEQ.nextVal,:SITE_ID,:NAME,1,:Source,SYSDATE,SYSDATE+0.0007) RETURNING KEYWORD_ID into :Key_ID";com.CommandText = sql;//com.Parameters.Add(new OracleParameter(":ID", OracleDbType.Int64, allKeyWords.Select(n => n.Keyword_Id).ToArray(), ParameterDirection.Input));com.Parameters.Add(new OracleParameter(":SITE_ID", OracleDbType.Int64, allKeyWords.Select(n => n.Site_Id).ToArray(), ParameterDirection.Input));com.Parameters.Add(new OracleParameter(":NAME", OracleDbType.NVarchar2, allKeyWords.Select(n => n.Keyword_Name).ToArray(), ParameterDirection.Input));com.Parameters.Add(new OracleParameter(":Source", OracleDbType.NVarchar2, allKeyWords.Select(n => n.Source).ToArray(), ParameterDirection.Input));var outputIdParm = new OracleParameter(":Key_ID", OracleDbType.Int32, ParameterDirection.Output);com.Parameters.Add(outputIdParm);com.ExecuteNonQuery();var allKeyWordIds = outputIdParm.Value as OracleDecimal[];for (int i = 0; i < allKeyWords.Count; i++){allKeyWords[i].Keyword_Id = allKeyWordIds[i].Value.ToInteger();}
转载于:https://www.cnblogs.com/xiaolb/p/3785400.html
各种数据库的批量插入操作_Oracle相关推荐
- mysql新增,更新,批量插入操作
mysql新增和更新操作 一.Insert的几种语法 例子: CREATE TABLE `users` (`id` int(11) NOT NULL AUTO_INCREMENT,`username` ...
- oracle批量插入报错,[数据库]Mybatis 批量插入数据 关于Oracle 批量插入报错:ORA
[数据库]Mybatis 批量插入数据 关于Oracle 批量插入报错:ORA 0 2020-08-19 08:00:06 Mybatis 批量插入数据 关于Oracle 批量插入报错:ORA-009 ...
- php基于laravel框架的批量插入操作
在日常开发中,用到批量插入的操作还是挺多的.记得很早很早以前,我还是在循环中写sql插入,结果被项目经理按在地上摩擦.好吧,性能这东西,用不到的时候还好,万一性能成为瓶颈,那代码优化,数据库优化就首当 ...
- jdbc连接Oracle/MySQL数据库进行批量导入操作,如何提高效率???
使用JDBC连接Oracle数据库进行批量数据导入的时候,特别是大批量数据连续插入(百万级或以上),如何提高效率呢? 在JDBC编程接口中有两个方法特别值得注意: (1)void addBatch() ...
- mongodb数据库,批量插入性能测试记录
spring boot 框架下,操作mongodb数据库 maven:spring-data-mongodb:2.1.3.RELEASE mongo数据库用的是本地的mongo,所以环境不一样,可能结 ...
- 使用Shell对MySQL指定的库进行SQL语句批量插入操作
需求: 某环境MySQL数据库中有1000个以yz_xxx开头命名的库,要求:在所有以yz_xxx开头命名的库中插入指定的SQL语句. 解决一: 使用Navicat Mysql工具连接到MyS ...
- JAVA ee6 result结果集_java对数据库的表插入操作时,显示已生成用于更新的结果集...
package chang; // 一个插入操作在两行 * 号之间 应该是插入有问题 不知道问 ...
- 大数据写入到Oracle数据库(批量插入数据)
开发中经常遇到批量插入数据的需求,为了提高开发效率大多会使用ORM架构,个别之处 才会手写SQL,我们使用C#.NET Core5.0开发,所以优先选择了微软的EF. 但是EF原生没有批量操作功能,需 ...
- 一分钟内向数据库中批量插入100万数据
罗列一下三种插入方式: 1.动态SQL拼接 批量插入一万条数据:4.7s @Testpublic void dynamicSql() {List<NotifyRecordEntity> n ...
最新文章
- 数据院携手汽车工程系,女生节尽展清华大数据风采~
- c++ List(双向链表)
- Gitlab14.x 安装、配置、启动 (Centos/Red Hat7/8.x)
- NVIDIA DLI 深度学习培训 | 北京站 即将开班
- 世界级数学家加入华为,曾获菲尔兹奖 网友:终于知道数理化的重要了
- SpringBoot中如何实现全链路调用日志跟踪?这方法才优雅!
- Android java传递int类型数组给C
- 计算机小白学生物信息的难度,基因表达数据分析,对于还是分子生物学小白的我来说太难了。。。...
- iOS开发中的错误整理,再一次整理通过通知中心来处理键盘,一定记得最后关闭通知中心...
- WebApplication(Web应用程序)和WebSite(网站)的区别
- 支付宝服务商如何帮助商户快速注册支付宝上级和支付宝小程序以及开通支付宝小程序扫码点餐功能
- 手机下拉框是怎么做出来
- Basic SRVCC 基本SRVCC 信令流程
- 基于Tensorflow里CNN文本分类
- 迪厅装修后地板清洁与保养
- 什么是数据描述统计分析指标?
- 模板会有多层镜像_【保持最新版本】EVE-NG 新版模板,镜像。2020-12-27有更新
- 局域网可以访问,但打印机就是连不上,提示拒绝访问,原来是这个原因
- Java判断单链表是否有环的两种实现方法
- org.dom4j 解析XML
热门文章
- python制作表格的语句_python读取excel表格生成sql语句 第一版
- linux安装redis有什么用吗,Linux下 安装Redis
- html5 瓶颈,html5+css3方式实现mobie app的一些瓶颈
- lightgbm过去版本安装包_谨慎更新华为EMUI10.1版本
- 基于AWT、Swing的GUI编程 - 多个命令共享同一个监听器类
- MySQL常用命令_vortex_新浪博客
- 02HTML 超链接与图像标记各是什么,【HTML篇】3.HTML的图片标签、超链接标签
- hive if语句_Hive实践(高阶篇)
- 恒大继续押宝造车 9.3亿美元收购NEVS的51%股权
- Linux进程间通信——消息队列