• 各种数据库的批量插入操作_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();
                        }
    

      

      

     

     

  • 相关阅读:
    linux下QT程序输出乱码解决方法
    Qt中新建类构造函数的初始化参数列表
    移植tslib1.4至mini2440
    Linux中总线设备驱动模型及平台设备驱动实例
    igntie实现数据同步
    django-初始化举例
    django-总体
    django-admin层
    django-view层
    django-template层
  • 原文地址:https://www.cnblogs.com/xiaolb/p/3785400.html
Copyright © 2020-2023  润新知