.Net批量插入数据
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批量插入数据的更多相关文章
- C#批量插入数据到Sqlserver中的四种方式
我的新书ASP.NET MVC企业级实战预计明年2月份出版,感谢大家关注! 本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的 ...
- .Net批量插入数据到SQLServer数据库,System.Data.SqlClient.SqlBulkCopy类批量插入大数据到数据库
批量的的数据导入数据库中,尽量少的访问数据库,高性能的对数据库进行存储. 采用SqlBulkCopy来处理存储数据.SqlBulkCopy存储大批量的数据非常的高效,将内存中的数据表直接的一次性的存储 ...
- sql 中的Bulk和C# 中的SqlBulkCopy批量插入数据 ( 回顾 and 粗谈 )
通常,我们会对于一个文本文件数据导入到数据库中,不多说,上代码. 首先,表结构如下. 其次,在我当前D盘中有个文本文件名为2.txt的文件. 在数据库中,可以这样通过一句代码插入. Bulk in ...
- Java 批量插入数据(Oracle)
//批量添加20000条数据用时8秒. try { String url = "jdbc:oracle:thin:@IP:1521:orcl"; // orcl为数据库的SI ...
- 批量插入数据(基于Mybatis的实现-Oracle)
前言:做一个数据同步项目,要求:同步数据不丢失的情况下,提高插入性能. 项目DB框架:Mybatis.DataBase:Oracle. -------------------------------- ...
- C#批量插入数据到Sqlserver中的三种方式
本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生 成 ...
- SqlServer——批量插入数据
像Major表里面批量插入数据演示: 代码如下: Declare @I int Set @I= Begin Tran InsertData: Insert into Major values(@I,' ...
- mybatis批量插入数据到oracle
mybatis 批量插入数据到oracle报 ”java.sql.SQLException: ORA-00933: SQL 命令未正确结束“ 错误解决方法 oracle批量插入使用 insert a ...
- SQLServer 批量插入数据的两种方法
SQLServer 批量插入数据的两种方法-发布:dxy 字体:[增加 减小] 类型:转载 在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Ins ...
- C#_批量插入数据到Sqlserver中的四种方式
先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生成一个GUID算法所花的时间肯定比你从数据表中重新查询上一条记 ...
随机推荐
- 14.msql_python
# 1.安装 pip install pymysql import pymysql try: # 1.链接 数据库 链接对象 connection() conn = pymysql.Connect( ...
- Python中的单例模式——装饰器实现剖析
Python中单例模式的实现方法有多种,但在这些方法中属装饰器版本用的广,因为装饰器是基于面向切面编程思想来实现的,具有很高的解耦性和灵活性. 单例模式定义:具有该模式的类只能生成一个实例对象. 先将 ...
- NUMA特性禁用
一.检查OS是否开启NUMA # numactl --hardware 二.Linux OS层面禁用NUMA 1.修改 grub.conf # vi /boot/grub/grub.conf #/* ...
- PHP设计模式_工厂模式
个人理解工厂类相当于平时用的基类,只需要把类new一次然后付给一个变量,以后直接引入基类调用变量使用类里的方法即可 了解 工厂模式,工厂方法或者类生成对象,而不是在代码中直接new. 使用工厂模式,可 ...
- java 生成txt文件
FileWriter fileWriter = new FileWriter("C:/Users/li/Desktop/a.txt"); fileWriter.write(“aaa ...
- docker 15 dockerfile案例-CMD、ENTRYPOINT案例
CMD.ENTRYPOINT都是指定一个容器启动时要运行的命令.但是CMD会覆盖前面的参数,而ENTRYP会追加组合原来的参数 未完待续...
- Mybatis学习总结(九)——查询缓存
一.什么是查询缓存 mybatis提供查询缓存,用于减轻数据压力,提高数据库性能.mybaits提供一级缓存和二级缓存. 1.一级缓存是sqlSession级别的缓存.在操作数据库时需要构造sqlSe ...
- 记一次InputStream引起的乱码
项目上线一周后,正准备看新闻的我突然接到了一个任务.线上突然出现了一条乱码的数据,需要解决这个bug.于是我放下了手中的保温杯,开始解决这个bug.经过一番折腾,发现是有一个同事在处理IO流上写得有点 ...
- Git-命令行-使用 Tag 标记你的代码
前言 正文开始之前,我想我们需要弄明白几个问题: 1.tag 是什么? 2.使用tag 的好处? 3.tag 和 branch 的区别以及使用场景? tag 是什么? tag , 翻译过来是标签的意思 ...
- OpenResty入门之使用Lua扩展Nginx
记住一点:nginx配置文件很多坑来源自你的空格少了或多了. 1.Centos下载安装 如果你的系统是 Centos 或 RedHat 可以使用以下命令: yum install readline-d ...