今天发现了一个超级快速插入大量数据到数据库的方法SqlBulkCopy,由于我这里是读Excel文件,所以我这里会提及到处理空行的方法和读取Excel的方法。下面我们会通过数据库跟踪器跟踪数据库发生了什么。

我们开始创建一个模型

public class TBModel{public string name { get; set; }public string phone { get; set; }public string addr { get; set; }}

然后就是读取Excel的方法

#region  读取Excel文件到DataSet中/// <summary>///     读取Excel文件到DataSet中/// </summary>/// <param name="filePath">文件路径</param>/// <returns></returns>public static DataSet ExcelToDataSet(string filePath, string fileName){var connStr = string.Empty;var fileType = Path.GetExtension(fileName);if (string.IsNullOrEmpty(fileType)) return null;if (fileType == ".xls")connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + filePath + ";" +";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1\"";elseconnStr = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + filePath + ";" +";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\"";var sql_F = "Select * FROM [{0}]";OleDbConnection conn = null;OleDbDataAdapter da = null;DataTable dtSheetName = null;var ds = new DataSet();try{// 初始化连接,并打开conn = new OleDbConnection(connStr);conn.Open();// 获取数据源的表定义元数据                       var SheetName = "";dtSheetName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });// 初始化适配器da = new OleDbDataAdapter();for (var i = 0; i < dtSheetName.Rows.Count; i++){SheetName = (string)dtSheetName.Rows[i]["TABLE_NAME"];if (SheetName.Contains("$") && !SheetName.Replace("'", "").EndsWith("$")){continue;}da.SelectCommand = new OleDbCommand(string.Format(sql_F, SheetName), conn);var dsItem = new DataSet();da.Fill(dsItem, "OA_MeetingPositionArrangement");ds.Tables.Add(dsItem.Tables[0].Copy());}}catch (Exception ex){}finally{// 关闭连接if (conn.State == ConnectionState.Open){conn.Close();da.Dispose();conn.Dispose();}}return ds;}#endregion

去除datatable里面的空行

#region 去除datatable里面的空行public static void RemoveEmpty(DataTable dt){List<DataRow> removelist = new List<DataRow>();for (int i = 0; i < dt.Rows.Count; i++){bool IsNull = true;for (int j = 0; j < dt.Columns.Count; j++){if (!string.IsNullOrEmpty(dt.Rows[i][j].ToString().Trim())){IsNull = false;}}if (IsNull){removelist.Add(dt.Rows[i]);}}for (int i = 0; i < removelist.Count; i++){dt.Rows.Remove(removelist[i]);}}#endregion

然后就是使用SqlBulkCopy大批量导入数据

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;
using System.Diagnostics;
using System.IO;namespace ConsoleAppTest
{class Program{static void Main(string[] args){//读取Excel文件var ds = ExcelToDataSet("D:/", "temp.xlsx");TBModel tbmodel = new TBModel();DataTable titledt = new DataTable();titledt.Columns.Add("Title");titledt.Rows.Add(tbmodel.name);titledt.Rows.Add(tbmodel.phone);titledt.Rows.Add(tbmodel.addr);//检查文件和列是否相同if (ds.Tables[0].Columns.Count == titledt.Rows.Count){for (int i = 0; i < titledt.Rows.Count; i++){if (ds.Tables[0].Columns[i].ToString() != titledt.Rows[i]["Title"].ToString()){Console.WriteLine("表格有误");}}}else{Console.WriteLine("表格有误");}//去空行RemoveEmpty(ds.Tables[0]);//计时开始Stopwatch st = new Stopwatch();st.Start();using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=1234;database=MangoDB")){conn.Open();using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn)){try{//插入到数据库的目标表:表名  bulkCopy.DestinationTableName = "tbs";//内存表的字段 对应数据库表的字段   bulkCopy.ColumnMappings.Add("name", "TempData");bulkCopy.WriteToServer(ds.Tables[0]);}catch (Exception ex){Console.WriteLine(ex);}}}st.Stop();Console.WriteLine("成功!测试时间为:" + st.ElapsedMilliseconds);Console.Read();}}
}

这里导入一百万条数据大概8秒9秒左右。。。测试了好几次,快的不行

打开Sqlserver Profiler跟踪,会发现执行的是如下语句:

insert bulk tbs ([name] VarChar(50), phone VarChar(50) addr VarChar(50))

百度了一下msdn

BULK INSERT   [ database_name . [ schema_name ] . | schema_name . ] [ table_name | view_name ]   FROM 'data_file'   [ WITH   (   [ [ , ] BATCHSIZE = batch_size ]   [ [ , ] CHECK_CONSTRAINTS ]   [ [ , ] CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } ]   [ [ , ] DATAFILETYPE =   { 'char' | 'native'| 'widechar' | 'widenative' } ]   [ [ , ] DATASOURCE = 'data_source_name' ][ [ , ] ERRORFILE = 'file_name' ][ [ , ] ERRORFILE_DATASOURCE = 'data_source_name' ]   [ [ , ] FIRSTROW = first_row ]   [ [ , ] FIRE_TRIGGERS ]   [ [ , ] FORMATFILE_DATASOURCE = 'data_source_name' ][ [ , ] KEEPIDENTITY ]   [ [ , ] KEEPNULLS ]   [ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ]   [ [ , ] LASTROW = last_row ]   [ [ , ] MAXERRORS = max_errors ]   [ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ]   [ [ , ] ROWS_PER_BATCH = rows_per_batch ]   [ [ , ] ROWTERMINATOR = 'row_terminator' ]   [ [ , ] TABLOCK ]   -- input file format options[ [ , ] FORMAT = 'CSV' ][ [ , ] FIELDQUOTE = 'quote_characters'][ [ , ] FORMATFILE = 'format_file_path' ]   [ [ , ] FIELDTERMINATOR = 'field_terminator' ]   [ [ , ] ROWTERMINATOR = 'row_terminator' ]   )]   

这里是MSDN的地址:https://docs.microsoft.com/zh-cn/sql/t-sql/statements/bulk-insert-transact-sql?view=sql-server-2017

看着很像insert into tbs select * from tb这种,然后试了几次这种插入数据的方式,发现还是上面的那种比这种快了好几秒,不过这两种方式使用的地方不同,所以使用的时候各有所需吧

SqlBulkCopy批量插入数据库相关推荐

  1. sql server 使用SqlBulkCopy批量插入数据库

    sql server sqlbulkcopy 批量数据插入数据库使用的是System.Data.SqlClient中的 SqlBulkCopy批量数据插入数据库 sql server 使用SqlBul ...

  2. 使用SqlBulkCopy批量插入数据库速度非常可以,本人用的是SQL service 五万条数据2秒

    SqlBulkCopy主要功能是把其他数据源(数据行DataRow,数据表DataTable)的数据有效批量的导入到SQL Server或其他数据库表中的功能.SqlBulkCopy在应用到大批量数据 ...

  3. mysql不支持addbatch_【MySql】Java 批量插入数据库addBatch

    //addBatch批量插入数据库 public static void insertCommentToMySql(Set commentList) { Iterator it = commentLi ...

  4. MYSQL批量插入数据库实现语句性能分析

    MYSQL批量插入数据库实现语句性能分析 假定我们的表结构如下 代码如下   CREATE TABLE example ( example_id INT NOT NULL, name VARCHAR( ...

  5. sql批量插入数据mysql_MYSQL批量插入数据库实现语句性能分析

    假定我们的表结构如下: CREATE TABLE example ( example_id INT NOT NULL, name VARCHAR( 50 ) NOT NULL, value VARCH ...

  6. 大量数据批量插入数据库

    大量数据批量插入数据库 前言 工作时遇到了大量数据需要插入到数据库的情况,一条条的插入速度慢效率低下,不能满足需求,为了解决此问题采用了sql中使用foreach,并在service中设置批量来进行批 ...

  7. 转:Mybatis与JDBC批量插入数据库哪个更快

    转自 http://www.cnblogs.com/fnz0/p/5713102.html, https://www.cnblogs.com/wxw7blog/p/8706797.html [转]: ...

  8. 记一次批量插入数据库脚本练习

    批量插入数据库脚本 1.建表 dept表 emp表 2.设置参数log_bin_trust_function_creators 3.创建函数,保证每条数据不同 mysql自定义函数 一.基本语法 二. ...

  9. .net使用SqlBulkCopy类操作DataTable批量插入数据库数据,然后分页查询坑

    在使用SqlBulkCopy类操作DataTable批量插入数据,这种操作插入数据的效率很高,就会导致每一条数据在保存的时间基本一样,在我们分页查询添加的数据是,使用数据的添加时间来排序就会出现每页的 ...

最新文章

  1. IP白名单添加了当前IP,获取access_token时依然报出错误码40164的坑
  2. 如何在Mac上的IntelliJ IDEA中增加IDE内存限制?
  3. 使用Eclipse可以方便的统计工程或文件的代码行数,
  4. linux设置双屏拼接_双屏办公,用起来到底有多爽
  5. 高精度运算模板(大数模板)
  6. 大数据技术之kafka (第 3 章 Kafka 架构深入) Kafka 事务
  7. 自定义曲线_Qt编写的项目作品17-自定义曲线图柱状图
  8. Bioconductor Workflows
  9. 全网最详细ANSYS Maxwell16下载及安装
  10. Xshell入门使用教程
  11. 通过抓包攻破人脸识别系统:安全问题存疑
  12. mysql 月初 月末_月初 月末 sql 语句(日期所在月的第一天,最后一天)
  13. 获取客户端真实 IP
  14. 批量修改文件名方法:everything软件
  15. origin画图很多个重叠在一起的
  16. CheckBox设置不可点击
  17. swift使用相机拍照
  18. mysql 分页面试题_MySQL常见面试题
  19. excel拆分表格如何操作?
  20. 织梦 php版本,织梦DEDECMS在PHP版本高于5.5的情况下无法使用关键词內链的解决方法...

热门文章

  1. snmpwalk命令常用方法
  2. 将M进制的数转换为N进制的数(java)
  3. 5404. 用栈操作构建数组
  4. 使用Xshell连接Ubuntu详解
  5. 浅入深出Vue:子组件与数据传递
  6. 关于MQTT、HTTP、WebService
  7. 解读Laravel,看PHP如何实现Facade?
  8. 2016年5月30日上午(传智Bootstrap笔记六(图片样式))
  9. [注]什么是用户?估计90%人不知道
  10. C++中固定长度短字符串比较是否相同,忽略大小写比对时的小技巧