C# 分享一个 Oracle 批处理方法,实测批量插入 100 万条数据 用时约 6 秒

2 篇文章 0 订阅
1 篇文章 0 订阅

1、首先在 Oracle 数据库中新建个表用于测试使用

create table table1
(
  c_int  int         ,
  c_date date        ,
  c_char varchar2(50)  
);

2、C# 程序实现代码

 代码参考自博文:https://www.cnblogs.com/isline/archive/2010/08/31/1813722.html

using Oracle.ManagedDataAccess.Client;
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main()
        {
            Console.WriteLine($"{DateTime.Now.ToString()} ----- 正在初始化中...");

            var recordCount = 1000000; //批量插入100w条数据

            using (var cmd = new OracleCommand())
            {
                cmd.CommandText = " insert into table1 (c_int, c_date, c_char) values (:c_int, :c_date, :c_char) ";
                cmd.ArrayBindCount = recordCount;  //指定单次需要处理的条数

                Console.WriteLine($"{DateTime.Now.ToString()} ----- 正在定义参数...");

                var c_int  = new int[recordCount];
                var c_date = new DateTime[recordCount];
                var c_char = new string[recordCount];
                    
                cmd.Parameters.Add(new OracleParameter("c_int" , OracleDbType.Int32   , c_int , ParameterDirection.Input));
                cmd.Parameters.Add(new OracleParameter("c_date", OracleDbType.Date    , c_date, ParameterDirection.Input));
                cmd.Parameters.Add(new OracleParameter("c_char", OracleDbType.Varchar2, c_char, ParameterDirection.Input));

                Console.WriteLine($"{DateTime.Now.ToString()} ----- 正在组装参数数据...");
                
                for (int i = 0; i < recordCount; i++)
                {
                    c_int[i]  = (i + 1);
                    c_date[i] = DateTime.Now;
                    c_char[i] = "批处理测试";
                }

                Console.WriteLine($"{DateTime.Now.ToString()} ----- 正在建立数据库连接...");

                using (var con = new OracleConnection())
                {
                    con.ConnectionString = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.2.11)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=Test)));User ID=CRM;Password=123456;Persist Security Info=True;Pooling=false;Pooling=True;Min Pool Size=1;Max Pool Size=200;";
                    con.Open();

                    cmd.Connection = con;

                    Console.WriteLine($"{DateTime.Now.ToString()} ----- 正在执行批处理操作...");

                    var startTime = DateTime.Now;
                    var count = cmd.ExecuteNonQuery();  //执行批处理操作,并返回影响行数
                    var endTime = DateTime.Now;

                    Console.WriteLine($"{DateTime.Now.ToString()} ----- 执行完毕!测试 {recordCount} 条数据,影响 {count} 条、耗时 {(endTime - startTime).ToString("hh\\:mm\\:ss\\.fffffff")}");
                }
            }

            Console.WriteLine($"{DateTime.Now.ToString()} ----- 按任意键结束。");
            Console.ReadKey();
        }
    }
}

3、查看运行结果


PS:本次用于测试的 (数据库端) 计算机配置为 CPU i7-7代、RAM8GB、机械硬盘(非固态),要是能换上固态硬盘的话、那么速度上应该还会有很大的提升空间的! ^ v ^

 

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个使用Oracle.ManagedDataAccess批量插入数据的完整例子: ```csharp using Oracle.ManagedDataAccess.Client; using System; using System.Collections.Generic; using System.Data; using System.Linq; namespace OracleBulkInsertExample { class Program { static void Main(string[] args) { string connectionString = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=XE)));User Id=hr;Password=hr;"; // 构建数据表和数据集 DataTable employeesTable = new DataTable(); employeesTable.Columns.Add("ID", typeof(int)); employeesTable.Columns.Add("NAME", typeof(string)); employeesTable.Columns.Add("AGE", typeof(int)); employeesTable.Columns.Add("SALARY", typeof(double)); employeesTable.Rows.Add(1, "John Smith", 35, 5000.50); employeesTable.Rows.Add(2, "Mary Johnson", 28, 4000.75); employeesTable.Rows.Add(3, "Peter Lee", 42, 7000.25); employeesTable.Rows.Add(4, "Kim Chen", 31, 5500.00); DataSet employeesDataSet = new DataSet(); employeesDataSet.Tables.Add(employeesTable); // 使用批量插入数据插入到数据库中 using (OracleConnection connection = new OracleConnection(connectionString)) { connection.Open(); OracleCommand command = new OracleCommand("INSERT INTO EMPLOYEES(ID, NAME, AGE, SALARY) VALUES(:ID, :NAME, :AGE, :SALARY)", connection); command.ArrayBindCount = employeesTable.Rows.Count; command.Parameters.Add(":ID", OracleDbType.Int32, employeesTable.AsEnumerable().Select(r => r.Field<int>("ID")).ToArray(), ParameterDirection.Input); command.Parameters.Add(":NAME", OracleDbType.Varchar2, employeesTable.AsEnumerable().Select(r => r.Field<string>("NAME")).ToArray(), ParameterDirection.Input); command.Parameters.Add(":AGE", OracleDbType.Int32, employeesTable.AsEnumerable().Select(r => r.Field<int>("AGE")).ToArray(), ParameterDirection.Input); command.Parameters.Add(":SALARY", OracleDbType.Double, employeesTable.AsEnumerable().Select(r => r.Field<double>("SALARY")).ToArray(), ParameterDirection.Input); int rowsAffected = command.ExecuteNonQuery(); Console.WriteLine($"{rowsAffected} rows inserted."); } Console.ReadLine(); } } } ``` 在上面的例子中,我们首先创建了一个包含员工信息的数据表和数据集。然后,我们使用Oracle.ManagedDataAccess客户端连接到Oracle数据库,并使用批量插入数据插入到数据库中。 请注意,我们使用OracleCommand的ArrayBindCount属性指定要插入的行数,然后使用参数化查询和数组绑定技术将数据传递给INSERT语句。 最后,我们输出插入的行数,然后关闭数据库连接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值