C# 海量数据瞬间插入到数据库的方法

当我们在数据库中进行大量的数据追加时,是不是经常因为数据量过大而苦恼呢?
而所谓的海量数据,一般也是上万级的数据,比如我们要添加一百万条数据,应该如何提高它的效率呢?

Oracle数据库:

普通肉垫式

什么叫批量插入呢,就是一次性插入一批数据,我们可以把这批数据理解为一个大的数组,而这些全部只通过一个SQL来实现,而在传统方式下,需要调用很多次的SQL才可以完成,这就是著名的“数组绑定”的功能。我们先来看一下传统方式下,插入多行记录的操作方式:

 1 //设置一个数据库的连接串,
2 string connectStr = "User Id=scott;Password=tiger;Data Source=";
3 OracleConnection conn = new OracleConnection(connectStr);
4 OracleCommand command = new OracleCommand();
5 command.Connection = conn;
6 conn.Open();
7 //通过循环写入大量的数据,这种方法显然是肉垫
8 for (int i = 0; i < recc; i++)
9 {
10 string sql = "insert into dept values(" + i.ToString() + "," + i.ToString() + "," + i.ToString() + ")";
11 command.CommandText = sql;
12 command.ExecuteNonQuery();
13 }

使用ODP特性

 1 //设置一个数据库的连接串
2 string connectStr = "User Id=scott;Password=tiger;Data Source=";
3 OracleConnection conn = new OracleConnection(connectStr);
4 OracleCommand command = new OracleCommand();
5 command.Connection = conn;
6 //到此为止,还都是我们熟悉的代码,下面就要开始喽
7 //这个参数需要指定每次批插入的记录数
8 command.ArrayBindCount = recc;
9 //在这个命令行中,用到了参数,参数我们很熟悉,但是这个参数在传值的时候
10 //用到的是数组,而不是单个的值,这就是它独特的地方
11 command.CommandText = "insert into dept values(:deptno, :deptname, :loc)";
12 conn.Open();
13 //下面定义几个数组,分别表示三个字段,数组的长度由参数直接给出
14 int[] deptNo = new int[recc];
15 string[] dname = new string[recc];
16 string[] loc = new string[recc];
17 // 为了传递参数,不可避免的要使用参数,下面会连续定义三个
18 // 从名称可以直接看出每个参数的含义,不在每个解释了
19 OracleParameter deptNoParam = new OracleParameter("deptno", OracleDbType.Int32);
20 deptNoParam.Direction = ParameterDirection.Input;
21 deptNoParam.Value = deptNo;
22 command.Parameters.Add(deptNoParam);
23 OracleParameter deptNameParam = new OracleParameter("deptname", OracleDbType.Varchar2);
24 deptNameParam.Direction = ParameterDirection.Input;
25 deptNameParam.Value = dname; command.Parameters.Add(deptNameParam);
26 OracleParameter deptLocParam = new OracleParameter("loc", OracleDbType.Varchar2);
27 deptLocParam.Direction = ParameterDirection.Input;
28 deptLocParam.Value = loc;
29 command.Parameters.Add(deptLocParam);
30 //在下面的循环中,先把数组定义好,而不是像上面那样直接生成SQL
31 for (int i = 0; i < recc; i++)
32 {
33 deptNo[i] = i;
34 dname[i] = i.ToString();
35 loc[i] = i.ToString();
36 }
37 //这个调用将把参数数组传进SQL,同时写入数据库
38 command.ExecuteNonQuery();

当数据量达到100万级别时,所用时间依然令人满意,最快一次达到890毫秒,一般为1秒左右。

SqlServer数据库

既然Oracle可以如此爽快,那么在SqlServer中是否也可以这样做呢?
但是在SqlServer中却没有诸如ArrayBindCount 这样的操作属性。
不过,我们却可以借助于BULK INSERT来进入海量数据的添加。
代码:

 1 //设置一个数据库的连接串
2 string connectStr = "……";
3 SqlConnection conn = new SqlConnection(connectStr);
4 SqlCommand command = new SqlCommand();
5 command.CommandTimeout = 0;
6 command.Connection = conn;
7 /*说明:
8 * “c:\\sql.txt”是一个预先生成的包含100条数据的文件
9 * 每一个字段的信息以“,”分割
10 * 每一条数据以“|”符号分隔
11 * 每10万条数据一个事务。
12 */
13 command.CommandText = "BULK INSERT TableB FROM 'c:\\sql.txt' WITH (FIELDTERMINATOR = ',',ROWTERMINATOR ='|',BATCHSIZE = 100000)";
14 conn.Open();
15 //System.Data.SqlClient.SqlBulkCopy sqlBC
16 command.ExecuteNonQuery();
17
18 conn.Close();

虽然比不上Oracle那么变态,但是插入百万条数据也不过只用了几秒时间,比起我们平时的添加速度,无疑已经让人非常兴奋了吧,呵呵。

C# 海量数据瞬间插入到数据库的方法的更多相关文章

  1. C# Oracle海量数据瞬间插入到数据库的方法

    C# 海量数据瞬间插入到数据库的方法 当我们在数据库中进行大量的数据追加时,是不是经常因为数据量过大而苦恼呢?而所谓的海量数据,一般也是上万级的数据,比如我们要添加一百万条数据,应该如何提高它的效率呢 ...

  2. C# OracleBulkCopy 批量插入oracle数据库的方法

    只有安装了oracle 11G客户端的机器上才可以用,要用到ODP.NET组件中的oracleDataAccess.DLL,命名空间引用为Oracle.DataAccess.Client; 引用:Or ...

  3. .net批量插入SqlServer数据库的方法:

    using System;using System.Collections.Generic;using System.Configuration;using System.Data;using Sys ...

  4. 【hibernate 执行方法未插入数据库】hibernate的save方法成功执行,但是未插入到数据库

    今天做项目,碰上这个问题: hibernate的save方法成功执行,但是未插入到数据库. Dao层代码: @Override public void save(T t) { this.getSess ...

  5. 批量插入数据, 将DataTable里的数据批量写入数据库的方法

    大量数据导入操作, 也就是直接将DataTable里的内容写入到数据库 通用方法: 拼接Insert语句, 好土鳖 1. MS Sql Server:   使用SqlBulkCopy 2. MySql ...

  6. Excel导入数据库百万级数据瞬间插入

    Excel导入数据库百万级数据瞬间插入 百万级别,瞬间,有点吊哇

  7. [转] JAVA读取excel数据(插入oracle数据库)

    原文地址:http://blog.csdn.net/zczzsq/article/details/16803349 本实例做的是读取execl(只能读取.xls的execl,即只能读取03版的),如果 ...

  8. 30多条mysql数据库优化方法,千万级数据库记录查询轻松解决(转载)

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  9. JDBC-ODBC桥接方法连接Excel数据库的方法

    通过JDBC-ODBC桥接器访问Excel电子表格 1.设置数据源 Excel数据源选择的驱动程序是Microsoft Excel Driver 2.选择表 与访问其他数据库不同的是,我们必须在电子表 ...

随机推荐

  1. no appropriate service handler found,修改数据库的最大连接数,默认150

    no appropriate service handler found,频繁进行数据操作的时候,会出现这种错误.例如,当我读取excel时,一次读取好多数据,这个时候需要修改数据库的最大连接数 se ...

  2. sql bypass waf fuzz python

    从freebuf copy过来的,先保存,有空再改 #encoding=utf-8 import requests url = "http://127.0.0.1/index.php?id= ...

  3. 企业级工作流解决方案(七)--微服务Tcp消息传输模型之消息编解码

    Tcp消息传输主要参照surging来做的,做了部分裁剪和改动,详细参见:https://github.com/dotnetcore/surging Json-rpc没有定义消息如何传输,因此,Jso ...

  4. 面试阿里,腾讯90%会被问到的zookeeper,把这篇文章看完就够了。

    Zookeeper概述 zookeeper高容错数据一致性协议(CP)的分布式小文件系统,提供类似于文件系统的目录方式的数据存储. 全局数据一致性:每个server保存一份相同的数据副本,client ...

  5. python 中 try...finally... 的优雅实现

    1. 关于 try.. finally.. 假如上帝用 python 为每一个来到世界的生物编写程序,那么除去中间过程的种种复杂实现,最不可避免的就是要保证每个实例最后都要挂掉.代码可简写如下: tr ...

  6. IDM下载器的队列功能有什么用?

    使用IDM下载器中的队列功能,可以帮助大家快速分类下载任务,这样,就可以统一管理有同样下载需求的内容. 一.队列的添加及设置 打开IDM下载器,单击菜单中的"队列",可以看到在左侧 ...

  7. 如何使用ABBYY FineReader 识别竖排或反转文本?

    ABBYY FineReader 15(Windows系统)OCR文字识别软件拥有强大的OCR识别功能,能够对这些竖排排版的文档进行准确的识别,另外对于一些具有反转颜色(白色字符和黑暗背景的图像)的文 ...

  8. 你还在 if...else?代码这样写才好看!

    前言 if...else 是所有高级编程语言都有的必备功能.但现实中的代码往往存在着过多的 if...else.虽然 if...else 是必须的,但滥用 if...else 会对代码的可读性.可维护 ...

  9. LeetCode周赛#204 题解

    1566. 重复至少 K 次且长度为 M 的模式 #模拟 题目链接 题意 给定正整数数组 arr,请你找出一个长度为 m 且在数组中至少重复 k 次的模式. 模式 是由一个或多个值组成的子数组(连续的 ...

  10. 中级实训Android学习记录——Toast、AlertDialog、ProgressBar

    学习记录 2020/11/22 Toast Toast Toast是一个消息提示组件 我们可以设置其显示的位置 自定义其显示的内容 对Toast的简单封装可以达到不同的目的 Toast的默认用法 To ...