批量往数据库导入数据遇到的问题总结

  项目开发中,有个功能需要往数据库批量插入数据,刚开始没考虑那么多,就一条一条数据循环插入数据库,数据量少的时候,效率还可以,但是当数据量达到上千甚至几百时,这个方法效率就不行了,得等段时间才全部插入成功,用户体验度非常不好,果断pass掉该方法。

  接着换令一种方法,那就是拼接insert字符串,即"Insert into TableName Values(‘ ‘,‘ ‘,‘ ‘),(‘ ‘,‘ ‘,‘ ‘);",刚开始还比较happy,插入速度很快,效率很高,可是当数据过千后,问题出现了,报错了提示“INSERT 语句中行值表达式的数目超出了 1000 行值的最大允许值。”,我去,一次只能批量插入1000条数据,这也太坑了吧!要想继续用这种方法,就必须循环数据,每次插入1000条,这样得加各种判断比较繁琐,懒得加就继续pass。

  就这样兜兜转转找到了第三种方法,使用SqlBulkCopy类批量添加数据,经过查资料发现这个方法真是NB,百万级的数据插入数据库只用了十几秒甚至几秒,这效率简直要上天呀!于是果断用这个方法。下面是SqlBulkCopy类的简单用法:

 public void BatchInsert(List<HuiMaiCheAdCarSerialEntity> list)
        {
            DataTable dt = DataFormat.ListToDataTable<HuiMaiCheAdCarSerialEntity>(list);

            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(WebConfig.DealerRW, SqlBulkCopyOptions.KeepIdentity))
            {
                //每一批次中的行数
                bulkCopy.BatchSize = 100000;
                //超时之前操作完成所允许的秒数
                bulkCopy.BulkCopyTimeout = 1800;

                //将DataTable表名作为待导入库中的目标表名
                bulkCopy.DestinationTableName = "HuiMaiCheAdCarSerial";

                //将数据集合和目标服务器库表中的字段对应
                for (int i = 1; i < dt.Columns.Count; i++)
                {
                    //列映射定义数据源中的列和目标表中的列之间的关系
                    bulkCopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
                }
                //将DataTable数据上传到数据表中
                bulkCopy.WriteToServer(dt);
            }
        }

  这个方法不仅效率快,而且数据源不限,只要将数据加载到DataTable实例或者DataRow数组中都可以将数据批量插入数据库。

  就这样批量插入的问题愉快的解决了,以后再也不用担心上万级数据的批量插入效率问题了~~~

时间: 2024-08-05 20:36:29

批量往数据库导入数据遇到的问题总结的相关文章

在C#应用程序中,利用表值参数过滤重复,批量向数据库导入数据,并且返回重复数据

在很多情况下,应用程序都需要实现excel数据导入功能,数据如果只有几十条,或上百条,甚至上千条,速度还好. 但是不仅如此,如果客户提供给你的excel本身存在着重复数据,或是excel中的某些数据已经在数据库存在,那这时,在向数据库插入数据前你还得判重,如果不存在才进行导入 通常,我们第一步就会通过上传的方式把excel中的数据读到内存,然后通过循环的方式得出一条一条数据,接着对于每条数据用关键字段去往数据库中进行一次查重,若存在则不做事情,若 不存在则向数据库中插入一条数据.这样一来,我们每

SQL从其他服务器数据库导入数据到本地数据库中

EXEC sp_dropserver 'ITSV2', 'droplogins' exec sp_addlinkedserver 'ITSV2' , '' , 'SQLOLEDB' , '168.9.123.123' exec sp_addlinkedsrvlogin 'ITSV2' , 'false' , null , 'sa' , 'sa' drop table test2; select top 12 * into test2 from ITSV2.InfoDB.dbo.city sele

SQL*Loader 从文本文件向数据库导入数据

之前我的一遍 blog 写了怎样使用 Toad 这个工具从 excel 或者 csv 文件向数据库导入数据. 其实 Oracle 自己提供了这样一个工具, 叫做 SQL*Loader. 这个工具使用起来没有那么直接, 也比较容易出错, 但是它非常适合导入大数据量的文本. 执行效率非常高, 号称一小时能导入100 G (听说). 这里给出一个简单的例子, 怎么去使用它. 比方说, 有个客户想要从他之前使用的 ERP 软件里面, 把数据导入到 Oracle 的 EBS. 当然他不可能直接表对表的复制

向orale数据库导入数据的时候报 ORA-01658

问题描述:在向orale数据库导入数据的时候报 ORA-01658: 无法为表空间 XXX中的段创建 INITIAL 区错误. 这是由于表空间对应的数据文件中数据量超过Oracle在创建表空间的时候数据文件初始化大小值,当数据量达到这个值,再向数据库中导入数据就会报错. 解决办法:解决办法就是扩展表空间,可以选择将表容量扩大,比如扩展到5000MB,或者当表空间不够时每次自动增加一定的容量,如每次自增200M. -- 查询当前数据库中表空间是否为自动扩展 select tablespace_na

如何实现MindManager数据库导入数据连接

思维导图有时候也是需要数据来进行补充支持,对于MindManager思维导图来说,与数据库的链接使得功能更为强大,那么在MindManager数据库中又是如何导入数据呢. 一个数据库连接到数据源(Mindjet的CSV文件的数据库或文件夹).您可以浏览数据源和你的导图来进行内容的添加. 添加数据库连接后,在打开的窗口中,选择连接类型,你可以连接到下面的数据库类型: 微软Access 微软Excel 微软SQL服务器 MySQL服务器 逗号分隔值(CSV文件的文件夹中的每个文件作为一个表) 而且您

solr8.0 从数据库导入数据(三)

第一步:导入相关包: 在创建的核心目录下新建lib文件夹(如果有,无需建立),从Solr源码包的dist文件夹中导入两个solr-dataimporthandler包,以及一个mysql驱动包. 第二步:编辑下边路径中的solrconfig文件(mycore1为自己所创建的核心文件夹): 在文件末尾添加以下内容 <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.Dat

【转】Solr从数据库导入数据(DIH)

本文转自:http://blog.csdn.net/xiaoyu714543065/article/details/11849115 一. 数据导入(DataImportHandler-DIH) DIH 是solr 提供的一种针对数据库.xml/HTTP.富文本对象导入到solr 索引库的工具包.这里只针对数据库做介绍. A.准备以下jar包 apache-solr-dataimporthandler-4.0.0.jar apache-solr-dataimporthandler-extras-

MYSQL数据库导入数据时出现乱码的解决办法

首先在新建数据库时一定要注意生成原数据库相同的编码形式,如果已经生成可以用phpmyadmin等工具再整理一次,防止数据库编码和表的编码不统一造成乱码. 方法一: 通过增加参数 –default-character-set = utf8 解决乱码问题 mysql -u root -p password < path_to_import_file –default-character-set = utf8 方法二: 在命令行导入乱码解决 1. use database_name; 2. set n

solr6.6.2学习记录之三:从sqlserver数据库导入数据(全量导入)

1.配置准备 前提已经配置好了solr,并新创建了一个core;(我的是:D:\solr_home\core_demo) sqlserver数据库 ,  以数据库:demo_solr ,单表(demo_user)为例. 2.修改sorlconfig.xml sorlconfig.xml 位置: D:\solr_home\core_demo\conf ; 在 soreconfig.xml 的<requestHandler name="/select" class="sol