各种数据库的批量插入操作_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 keyword var 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();
}
各种数据库的批量插入操作_Oracle的更多相关文章
- JDBC的批量插入操作
在今天之前,当我遇到需要使用JDBC对数据库进行批量插入操作的时候,我使用的方法如下: ①使用Connection建立数据库连接: ②使用PreparedStatement提交SQL语句,将数据插入: ...
- C# 批量插入表SQLSERVER SqlBulkCopy往数据库中批量插入数据
#region 帮助实例:SQL 批量插入数据 多种方法 /// <summary> /// SqlBulkCopy往数据库中批量插入数据 /// </summary> /// ...
- MyBatis向数据库中批量插入数据
Foreach标签 foreach: collection:指定要遍历的集合; 表示传入过来的参数的数据类型.该参数为必选.要做 foreach 的对象,作为入参时,List 对象默认用 list 代 ...
- net core天马行空系列-各大数据库快速批量插入数据方法汇总
1.前言 hi,大家好,我是三合.我是怎么想起写一篇关于数据库快速批量插入的博客的呢?事情起源于我们工作中的一个需求,简单来说,就是有一个定时任务,从数据库里获取大量数据,在应用层面经过处理后再把结果 ...
- Mybatis对oracle数据库进行foreach批量插入操作
MySQL支持的语法 INSERT INTO `tableX` ( `a`, `b`, `c`, `d`, `e` ) VALUES <foreach collection ="lis ...
- MyBatis魔法堂:各数据库的批量Update操作
一.前言 MyBatis的update元素的用法与insert元素基本相同,因此本篇不打算重复了.本篇仅记录批量update操作的sql语句,懂得SQL语句,那么MyBatis部分的操作就简单了. ...
- Mybatis批量更新数据库与批量插入数据库(以oracle为例)
一.批量更新 1.普通写法(一条记录update一次,性能比较差,容易造成阻塞.不建议使用) <update id="updateBatch" parameterType=& ...
- SQLServer分页查询方法整理以及批量插入操作SqlBulkCopy
分页查询 通用方法:sqlserver 2005 + ROW_NUMBER() OVER()方式: ; TOP NOT IN方式 : ID FROM TripDetail ORDER BY ID) O ...
- java实现数据库之间批量插入数据
package comnf147Package; import java.sql.*; public class DateMigrationLagou { //连接SQLite private Con ...
随机推荐
- PropertyGrid—添加EventTab
零.引言 前面一篇文章介绍了如何在PropertyGrid中添加属性Tab,本文主要介绍如何添加事件选项卡.事件在许多对象中都有,尤其是在控件中,如何让对象的事件在PropertyGrid中显示出来呢 ...
- 理解js异步的概念
js引擎在执行的时候是单线程的,这是大家都知道的.我们先来看一段代码: <html> <head> <meta http-equiv="Content-Type ...
- z-index解决弹出层遮罩层覆盖子div不能显示输出的问题
// 添加以下代码来进行测试: // ajax 发生错误,就会执行$('body').ajaxError(function(e, xhr, setting, text){ // e - even ...
- Broadcast详解
今天闲来无事,研究了下Android的Broadcast,发现Broadcast在Android系统中担任着很艰巨的角色. Broadcast是Android的四大组件之一:Broadcast分为普通 ...
- Oracle数据库按属性成绩查询
create or replace function bb return nvarchar2as-----------自定义游标类型type class_student is record( snam ...
- 由chkconfig 引发的联想——怎么查看程序是否已经安装/成功安装
由chkconfig 引发的联想--怎么查看程序是否已经安装/成功安装 某天需要运行chkconfig,root登录依然找不到该命令. [root@localhost ~]# chkconfig ba ...
- c#创建带参数的线程
1.无参数线程的创建 Thread thread = new Thread(new ThreadStart(getpic)); thread.Start(); private void showmes ...
- elegant 的长整数加法 string 实现
string strAdd(string &v1, string &v2){ string res = ""; ; int len1 = v1.size(), le ...
- linux自旋锁
一.前言 在linux kernel的实现中,经常会遇到这样的场景:共享数据被中断上下文和进程上下文访问,该如何保护呢?如果只有进程上下文的访问,那么可以考虑使用semaphore或者mutex的锁机 ...
- 用OpenCV实现Otsu算法
算法的介绍 otsu法(最大类间方差法,有时也称之为大津算法)使用的是聚类的思想,把图像的灰度数按灰度级分成2个部分,使得两个部分之间的灰度值差异最大,每个部分之间的灰度差异最小,通过方差的计算来寻找 ...