1. 一般我们普通数据插入是这样的:

现在我们写一个控制台程序用常规办法添加10000条数据。

 //以下是批量插入数据的办法
            //连接字符串
string str = "Server=.;Database=doudou;Uid=sa;Pwd=1994min";
string doudou = "doudou";
int age = ; DateTime startTime = DateTime.Now; //创建一个本地的数据集合
DataTable dt = new DataTable();
//创建列
dt.Columns.Add("name");
dt.Columns.Add("age"); for (int i = ; i <= ; i++)
{
DataRow row = dt.NewRow();//创建 DataRow对象
//为每列赋值
row["name"] = doudou;
row["age"] = age; dt.Rows.Add(row);//插入到本地datatable中 }

这种方式执行完大概需要21秒

2.使用SqlBulkCopy 类操作数据的批量插入(同样是添加10000条数据):

 //连接字符串
string str = "Server=.;Database=doudou;Uid=sa;Pwd=1994min";
string doudou = "doudou";
int age = ; DateTime startTime = DateTime.Now; //创建一个本地的数据集合
DataTable dt = new DataTable();
//创建列
dt.Columns.Add("name");
dt.Columns.Add("age"); for (int i = ; i <= ; i++)
{
DataRow row = dt.NewRow();//创建 DataRow对象
//为每列赋值
row["name"] = doudou;
row["age"] = age; dt.Rows.Add(row);//插入到本地datatable中 } //批量插入语法
using(SqlBulkCopy sbc = new SqlBulkCopy(str))
{
//设置要插入的表名
sbc.DestinationTableName = "BatchWrite"; //与服务器数据库列名映射,
sbc.ColumnMappings.Add("name","name");
sbc.ColumnMappings.Add("age", "age"); //执行
sbc.WriteToServer(dt);
}; //获取执行的时间段
TimeSpan ts = DateTime.Now - startTime;
Console.WriteLine(ts.Seconds);
Console.ReadKey();

结果输出只用了不到1秒的时间

所以在批量添加的时候使用SqlBulkCopy类来操作效率还是比较高的,如果数据量特别大的时候也要考虑内存的问题,为了方便使用就封装了一下


public static bool ExcuteNonQuery(DataTable dt)
{
using (SqlConnection connection = new SqlConnection(connStr))//创建数据库连接
{
using (SqlBulkCopy sqlbulkcopy = new SqlBulkCopy(connection))
{
connection.Open();
//sqlbulkcopy.BulkCopyTimeout = 100; //超时之前操作完成所允许的秒数
sqlbulkcopy.BatchSize = dt.Rows.Count; //每一批次中的行数
sqlbulkcopy.DestinationTableName = dt.TableName; //服务器上目标表的名称
for (int i = ; i < dt.Columns.Count; i++)
{
sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName); //映射定义数据源中的列和目标表中的列之间的关系
}
sqlbulkcopy.WriteToServer(dt); // 将DataTable数据上传到数据表中
}
}
return true;
}
  
 调用方法:

public void AddData(){

    //创建一个本地的数据集合
DataTable dt = new DataTable();
//创建列
dt.Columns.Add("name");
dt.Columns.Add("age");
for(int i;i<;i++){ DataRow row = dt.NewRow();//创建 DataRow对象
row["name"] = "张三";
row["age"] = ;
dt.Rows.Add(row);
}
dt.TableName = "UserInfo"; //要添加的表明 SqlHelper.ExcuteNonQuery(dt);//调用批量插入方法
}

  

特别注意  sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);

插入的时候列的顺序可以不一致,但名称和数据类型最好要保存一致。不一致时候,也能进行正确的转换,除了比如DataTime数据类型,不能插入一个无效的string时间字符串。

在插入数据的时候如果数据类型是Guid类型的时候。一定要创建列的时候一定要指定数据类型: dt.Columns.Add("UserID", typeof(System.Data.SqlTypes.SqlGuid));,

不然会报“来自数据源的 String 类型的给定值不能转换为指定目标列的类型 uniqueidentifier。”这个错。

.Net批量插入数据的更多相关文章

  1. C#批量插入数据到Sqlserver中的四种方式

    我的新书ASP.NET MVC企业级实战预计明年2月份出版,感谢大家关注! 本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的 ...

  2. .Net批量插入数据到SQLServer数据库,System.Data.SqlClient.SqlBulkCopy类批量插入大数据到数据库

    批量的的数据导入数据库中,尽量少的访问数据库,高性能的对数据库进行存储. 采用SqlBulkCopy来处理存储数据.SqlBulkCopy存储大批量的数据非常的高效,将内存中的数据表直接的一次性的存储 ...

  3. sql 中的Bulk和C# 中的SqlBulkCopy批量插入数据 ( 回顾 and 粗谈 )

    通常,我们会对于一个文本文件数据导入到数据库中,不多说,上代码. 首先,表结构如下.   其次,在我当前D盘中有个文本文件名为2.txt的文件. 在数据库中,可以这样通过一句代码插入. Bulk in ...

  4. Java 批量插入数据(Oracle)

    //批量添加20000条数据用时8秒. try {    String url = "jdbc:oracle:thin:@IP:1521:orcl"; // orcl为数据库的SI ...

  5. 批量插入数据(基于Mybatis的实现-Oracle)

    前言:做一个数据同步项目,要求:同步数据不丢失的情况下,提高插入性能. 项目DB框架:Mybatis.DataBase:Oracle. -------------------------------- ...

  6. C#批量插入数据到Sqlserver中的三种方式

    本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生 成 ...

  7. SqlServer——批量插入数据

    像Major表里面批量插入数据演示: 代码如下: Declare @I int Set @I= Begin Tran InsertData: Insert into Major values(@I,' ...

  8. mybatis批量插入数据到oracle

    mybatis 批量插入数据到oracle报 ”java.sql.SQLException: ORA-00933: SQL 命令未正确结束“  错误解决方法 oracle批量插入使用 insert a ...

  9. SQLServer 批量插入数据的两种方法

    SQLServer 批量插入数据的两种方法-发布:dxy 字体:[增加 减小] 类型:转载 在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Ins ...

  10. C#_批量插入数据到Sqlserver中的四种方式

    先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生成一个GUID算法所花的时间肯定比你从数据表中重新查询上一条记 ...

随机推荐

  1. Python之requests库

    Request库 r = requests.get(url) 这个包括两个语句:Response.Request,我们重点来看一下Response Response包含了页面返回的所有信息,下面是它的 ...

  2. centos7 mongodb安装

    参考文档 http://www.runoob.com/mongodb/mongodb-connections.html https://www.cnblogs.com/layezi/p/7290082 ...

  3. Python:Day29 信号量、条件变量

    信号量:semaphore 信号量是用来控制线程并发数的.(理解:虽然GIL任意时刻都只有一个线程被执行,但是所有线程都有资格去抢,semaphore就是用来控制抢的GIL的数量,只有获取了semap ...

  4. 008_python内置语法

    一. 参考:http://www.runoob.com/python/python-built-in-functions.html (1)vars() 描述 vars() 函数返回对象object的属 ...

  5. 破解windows版idea

    近期使用idea的时候提示已过试用期,需要购买,否则只能使用半小时 网上破解方法很全,记录一下 1.下载破解补丁 百度网盘:https://pan.baidu.com/s/15Wq9-c4SVwg_2 ...

  6. Python脱产8期 Day09 2019/4/23

    内存管理 一.引用计数:垃圾回收机制的依据 1.变量的值被引用,该值的引用计数 +12.变量的值被解绑,该值的引用计数 -13.引用计数为0时就会被垃圾回收机制回收 二.引用计数会出现循环引用问题:相 ...

  7. 【Atcoder hbpc C 183】1=0.999...

    Atcoder hbpc C 题意:给n个循环小数或者有限小数,问其中有多少个互不相同的. 思路:我的思路比较繁琐. 首先我们考虑分数化小数:假设原来的数是\(a.b(c)\),那么这个分数就是\(a ...

  8. JAVA 垃圾收集算法,垃圾收集器与内存分配策略(内容全面,解析简单易懂)

    垃圾收集器需要解决的三个问题: 1)哪些内存需要回收 2)什么时候回收 3)如何回收 背景:程序计数器,虚拟机栈,本地方法栈3个区域随线程而生,随线程而灭,在这几个区域内不需要过多的考虑回收的问题,因 ...

  9. Recurrent Neural Network[SRU]

    0.背景 对于如机器翻译.语言模型.观点挖掘.问答系统等都依赖于RNN模型,而序列的前后依赖导致RNN并行化较为困难,所以其计算速度远没有CNN那么快.即使不管训练的耗时程度,部署时候只要模型稍微大点 ...

  10. 【原创】jssh linux scp ssh 免密登录开源工具

    项目名 JSSH git地址: https://gitee.com/chejiangyi/jssh 项目介绍 linux scp(文件上传,下载) shell命令的java ssh jar和linux ...