各种数据库的批量插入操作_Oracle

最近工作中需要优化以前各种的Excel批量导入功能,目前将能优化的方面做个记录。

选用技术:

  目前.Net可以访问Oracle常用的Dll,有三种:

  1. 微软自带的 System.Data.OracleClient
  2. Oracle 公司提供的 Oracle.DataAccess
  3. 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

时间: 2024-07-29 14:24:20

各种数据库的批量插入操作_Oracle的相关文章

使用oledb对数据库进行增删改查及批量插入操作

使用oledb操作数据库工具类,可使用泛型统一操作 using System; using System.Collections.Generic; using System.Data; using System.Data.OleDb; using System.Linq; using System.Reflection; using System.Text; using System.Windows.Forms; namespace CommonUtil { public class DataB

jdbc批量插入操作(addBatch)

1 /** 2 * 批量插入 3 */ 4 @Test 5 public void testInsert(){ 6 Connection conn=null; 7 Statement st=null; 8 PreparedStatement pst=null; 9 try { 10 conn=DBUtils.getConn(); 11 conn.setAutoCommit(false);//事物不能自动提交 12 st=conn.createStatement(); 13 long start

MyBatis魔法堂:各数据库的批量Update操作

一.前言   MyBatis的update元素的用法与insert元素基本相同,因此本篇不打算重复了.本篇仅记录批量update操作的sql语句,懂得SQL语句,那么MyBatis部分的操作就简单了. 注意:下列批量更新语句都是作为一个事务整体执行,要不全部成功,要不全部回滚. 二.MSSQL的SQL语句 WITH R AS( SELECT 'John' as name, 18 as age, 42 as id UNION ALL SELECT 'Mary' as name, 20 as age

C# 调用Adodb对Access数据库执行批量插入

public void BatchInsertIntoAccess(DataTable dt) { ADODB.Connection cn; ADODB.Recordset rs; string strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\FileTmp\MMSCRM.mdb;Persist Security Info=False"; cn = new ADODB.Connection(); cn.Connec

C# 几种数据库的大数据批量插入

转载:http://www.cnblogs.com/luluping/archive/2012/08/09/2629515.html 在之前只知道SqlServer支持数据批量插入,殊不知道Oracle.SQLite和MySql也是支持的,不过Oracle需要使用Orace.DataAccess驱动,今天就贴出几种数据库的批量插入解决方法. 首先说一下,IProvider里有一个用于实现批量插入的插件服务接口IBatcherProvider,此接口在前一篇文章中已经提到过了. /// <summ

使用存储过程向数据库批量插入数据

<一> 前言 最近有个需求,需要向数据库并发批量插入数据. 最开始使用存储过程,类似这样的:  delimiter //   CREATE PROCEDURE load_part_tab()  begin      declare v int default 0;      while v < 8000000      do          insert into part_tab          values (v,'testing partitions',adddate('199

C#:几种数据库的大数据批量插入 - faib

在之前只知道SqlServer支持数据批量插入,殊不知道Oracle.SQLite和MySql也是支持的,不过Oracle需要使用Orace.DataAccess驱动,今天就贴出几种数据库的批量插入解决方法. 首先说一下,IProvider里有一个用于实现批量插入的插件服务接口IBatcherProvider,此接口在前一篇文章中已经提到过了. /// <summary> /// 提供数据批量处理的方法. /// </summary> public interface IBatch

几种数据库的大数据批量插入【转】

在之前只知道SqlServer支持数据批量插入,殊不知道Oracle.SQLite和MySql也是支持的,不过Oracle需要使用Orace.DataAccess驱动,今天就贴出几种数据库的批量插入解决方法. 首先说一下,IProvider里有一个用于实现批量插入的插件服务接口IBatcherProvider,此接口在前一篇文章中已经提到过了. /// <summary> /// 提供数据批量处理的方法. /// </summary> public interface IBatch

SqlBulkCopy与触发器,批量插入表(存在则更新,不存在则插入)

临时表:Test /****** 对象: Table [dbo].[Test] 脚本日期: 05/10/2013 11:42:07 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Test]( [ID] [int] IDENTITY(1,1) NOT NULL, [UserID] [int] NOT NULL, [UserName] [nvarchar](50) COLLATE Chines