sqlbulkcopy 批量插入数据
批量插入 Datetable数据 通过sqlbulkcopy 插入1百万条数据 用时 10秒钟 (有兴趣的小伙伴可以去测试)
/// <summary>
///
/// </summary>
/// <param name="connectionStr">连接字符串</param>
/// <param name="dataTableName">数据库表名称</param>
/// <param name="sourceDataTable"></param>
/// <param name="batchSize"></param>
public static void SqlBulkCopyByDataTable(string connectionStr, string dataTableName, DataTable sourceDataTable, int batchSize = )
{
using (SqlConnection connection = new SqlConnection(connectionStr))
{
using (System.Data.SqlClient.SqlBulkCopy sqlBulkCopy = new System.Data.SqlClient.SqlBulkCopy(connectionStr, SqlBulkCopyOptions.UseInternalTransaction))
{
try
{
sqlBulkCopy.DestinationTableName = dataTableName;
sqlBulkCopy.BatchSize = batchSize;
for (int i = ; i < sourceDataTable.Columns.Count; i++)
{
sqlBulkCopy.ColumnMappings.Add(sourceDataTable.Columns[i].ColumnName, sourceDataTable.Columns[i].ColumnName);
}
sqlBulkCopy.WriteToServer(sourceDataTable);
}
catch (Exception ex)
{ throw ex;
}
}
}
}
调用:
DataTable dt = new DataTable("测试");
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Age", typeof(int));
for (int i = ; i <= ; i++)
{
DataRow row = dt.NewRow();
row["Id"] = i;
row["Name"] = "名字" + i;
row["Age"] = i;
dt.Rows.Add(row);
}
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
Console.WriteLine("批量插入table时间:"+stopWatch.Elapsed);
批量插入List<T> :
#region List<T> 批量插入
/// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="data"></param>
/// <param name="sqlconn"></param>
public static void Sqlbulkcopy_<T>(List<T> data, string sqlconn = null)
{
#region 待处理数据初始化处理
List<PropertyInfo> pList = new List<PropertyInfo>();//创建属性的集合
DataTable dt = new DataTable();
//把所有的public属性加入到集合 并添加DataTable的列
Array.ForEach<PropertyInfo>(typeof(T).GetProperties(), p =>
{
pList.Add(p);
dt.Columns.Add(p.Name, p.PropertyType);
}); //获得反射的入口(typeof()) //要对 array 的每个元素执行的 System.Action。
foreach (var item in data)
{
DataRow row = dt.NewRow(); //创建一个DataRow实例
pList.ForEach(p => row[p.Name] = p.GetValue(item, null)); //给row 赋值
dt.Rows.Add(row); //加入到DataTable
}
#endregion
#region 批量插入数据库 SqlBulkCopy声明及参数设置
SqlBulkCopy bulk = new SqlBulkCopy(sqlconn, SqlBulkCopyOptions.UseInternalTransaction) //, SqlBulkCopyOptions.UseInternalTransaction
{
DestinationTableName = "Tongbu" /*设置数据库目标表名称*/
,
BatchSize = dt.Rows.Count /*每一批次中的行数*/
}; bulk.ColumnMappings.Add("Id", "Id"); //设置数据源中的列和目标表中的列之间的映射关系
// bulk.ColumnMappings.Add("FlightId", "FlightId");//ColumnMappings.Add("源数据表列名称", "目标表数据列名称");
bulk.ColumnMappings.Add("Name", "Name");
bulk.ColumnMappings.Add("Age", "Age"); //...
#endregion
bulk.WriteToServer(dt);
if (bulk != null)
{
bulk.Close();
}
}
#endregion
调用:
List<TestModel> T_list = new List<TestModel>();
for (int i = ; i <= ; i++)
{
T_list.Add(new TestModel() { Name = "Test" + i, Age = i });
} Stopwatch stopWatch = new Stopwatch();
stopWatch.Start(); Sqlbulkcopy_Tran<TestModel>(T_list); Console.WriteLine(stopWatch.Elapsed);
sqlbulkcopy 批量插入数据的更多相关文章
- sql 中的Bulk和C# 中的SqlBulkCopy批量插入数据 ( 回顾 and 粗谈 )
通常,我们会对于一个文本文件数据导入到数据库中,不多说,上代码. 首先,表结构如下. 其次,在我当前D盘中有个文本文件名为2.txt的文件. 在数据库中,可以这样通过一句代码插入. Bulk in ...
- SqlBulkCopy批量插入数据时,不执行触发器和约束的解决方法
原文:SqlBulkCopy批量插入数据时,不执行触发器和约束的解决方法 在new SqlBulkCopy对象的时候,设置一下SqlBulkCopyOptions选项即可,按位或运算 SqlBulkC ...
- C#中的SqlBulkCopy批量插入数据
在C#中,我们可以使用sqlBulkCopy去批量插入数据,其他批量插入方法不在讨论. 1 /// <summary> 2 /// SqlBulkCopy批量插入数据 3 /// < ...
- 用SqlBulkCopy批量插入数据到SqlServer数据库表中
首先创建一个数据库连接类:SQLHelper using System; using System.Collections.Generic; using System.Linq; using Syst ...
- MSSQL使用sqlbulkcopy批量插入数据
具体代码如下: /// <summary> /// 批量插入数据到BayonetZipFailedPic表 /// </summary> /// <param name= ...
- 使用 SqlBulkCopy 批量插入数据
/// <summary> /// 使用SqlBulkCopy将DataTable中的数据批量插入数据库中 /// </summary> /// <param name= ...
- c# sqlbulkcopy批量插入数据
dt信息中包含数据和表名 public static void SqlBulkInsert(DataTable dt, string connStr) { try { using (var conn ...
- 使用事务和SqlBulkCopy批量插入数据
SqlBulkCopy是.NET Framework 2.0新增的类,位于命名空间System.Data.SqlClient下,主要提供把其他数据源的数据有效批量的加载到SQL Server表中的功能 ...
- C#使用SqlTransaction事务回滚与SqlBulkCopy批量插入数据
C#中批量处理数据,有时候因为一条记录导致整个批量处理失败.这时候肯能会导致数据不全等问题,这时候我们可以使用SqlTransaction来进行事务回滚,即是要么全部成功要么全部不成功.如下代码 // ...
随机推荐
- android自动化必备之SDK
进入到SDK包中,通过打开SDK manager.exe即可看到SDK管理界面,可能部分童靴发现一直在加载出不来,我们需要设置代理来解决: 选择工具栏上的Tools->Options打开如下窗口 ...
- MySQL优化之my.conf配置详解
最近项目不太忙,所以有时间静心来研究下mysql的优化,对于MySQL的设置是否合理优化,直接影响到网站的速度和承载量!同时,MySQL也是优化难度最大的一个部分,不但需要理解一些MySQL专业知识, ...
- 谷歌浏览器的各种插件网址Chrome插件(谷歌浏览器)-超级详细
各种各样的插件,可以查找对自己有用的,自行下载安装 http://chromecj.com/
- Java核心技术及面试指南的视频讲解和代码下载位置
都是百度云盘,均无密码 代码下载位置: https://pan.baidu.com/s/1I44ob0vygMxvmj2BoNioAQ 视频讲解位置: https://pan.baidu.com/s/ ...
- 【Docker】(1)---Docker入门篇
Docker入门篇 简单一句话: Docker 是一个便携的应用容器. 一.Docker的作用 网上铺天盖地的是这么说的: (1) Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得 ...
- 关于ML.NET v0.7的发布说明
我们很高兴宣布推出ML.NET 0.7--面向.NET开发人员的最新版本的跨平台和开源机器学习框架(ML.NET 0.1发布于// Build 2018).此版本侧重于为基于推荐的ML任务提供更好的支 ...
- ES6躬行记(12)——数组
ES6为数组添加了多个新方法,既对它的功能进行了强化,也消除了容易产生歧义的语法. 一.静态方法 1)of() ES6为Array对象新增的第一个静态方法是of(),用于创建数组,它能接收任意个参数, ...
- Eclipse查看JDK源码(非常详细)
Eclipse查看源码的方式其实很简单,打开项目,然后按着ctrl,然后把鼠标光标移动到你想查看的方法或者对象上,这时会出现一条下划线,然后点击鼠标左键就可以进入那个方法或者对象了.但是有的情况下会出 ...
- SpringCloud系列——Ribbon 负载均衡
前言 Ribbon是一个客户端负载均衡器,它提供了对HTTP和TCP客户端的行为的大量控制.我们在上篇(猛戳:SpringCloud系列——Feign 服务调用)已经实现了多个服务之间的Feign调用 ...
- Scala(二) —— 函数
try 表达式 var result = try{ Integer.parseInt("dog") }catch{ case _ => 0 }finally{ println ...