sql 中的Bulk和C# 中的SqlBulkCopy批量插入数据 ( 回顾 and 粗谈 )
通常,我们会对于一个文本文件数据导入到数据库中,不多说,上代码。
首先,表结构如下.
其次,在我当前D盘中有个文本文件名为2.txt的文件。
在数据库中,可以这样通过一句代码插入。
Bulk insert T_Demo From 'D:\2.txt' With ( fieldterminator=',', rowterminator='\n' )
1) bulk insert: 为Sql server 中一个批量插入的操作
2)T_Demo: 要插入的表
3)'D:\2.txt': 数据源文件所在磁盘上的物理路径
4)with 相当于一些插入的附属条件,可以起这里添加一些约束限制条件等
5) fieldterminator=’,’字段的分割符为”,”一般的txt文本数据源的字段分隔都为逗号,当然也可以为其他,比如”|”
6)rowterminator=’\n’各条信息间的分割符为’\n’,一般的txt文本数据源的信息间的分割都是换行符,即一条信息占一行,也可以用其他格式如:”|\n”
在微软官方给的详细如下:
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' } ]
[ [ , ] FIELDTERMINATOR = 'field_terminator' ]
[ [ , ] FIRSTROW = first_row ]
[ [ , ] FIRE_TRIGGERS ]
[ [ , ] FORMATFILE = 'format_file_path' ]
[ [ , ] 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 ]
[ [ , ] ERRORFILE = 'file_name' ]
)]
这里我们主要看with中的一些参数:(部分)
1) BATCHSIZE : 指定批处理中的行数
2) CHECK_CONSTRAINTS:启用约束检查,指定在大容量导入操作期间,必须检查所有对目标表或视图的约束。若没有 CHECK_CONSTRAINTS 选项,则忽略所有 CHECK 和 FOREIGN KEY 约束,并在该操作后将表的约束标记为不可信。始终强制使用 UNIQUE、PRIMARY KEY 和 NOT NULL 约束。
3) FIRE_TRIGGERS
指定将在大容量导入操作期间执行目标表中定义的所有插入触发器。如果为针对目标表的 INSERT 操作定义了触发器,则每次完成批处理操作时均激发触发器。
4) KEEPNULLS
指定空列在大容量导入操作期间应保留 Null 值,而不插入列的任何默认值
5) ORDER ( { column [ ASC | DESC ] } [ ,...n ] )
指定如何对数据文件中的数据排序。如果根据表中的聚集索引(如果有)对要导入的数据排序,则可提高大容量导入的性能
6) ERRORFILE ='file_name'
指定用于收集格式有误且不能转换为 OLE DB 行集的行的文件。这些行将按原样从数据文件复制到此错误文件中。
--------------------------------------------------------------SqlBulkCopy分割线---------------------------------------------------------------------
在C#中,我们可以使用sqlBulkCopy去批量插入数据,其他批量插入方法不在讨论。
上代码......
/// <summary>
/// SqlBulkCopy批量插入数据
/// </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 (SqlBulkCopy sqlBulkCopy=new 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;
}
}
}
}
使用方式如下,这里我将插入100万条数据,
在SqlBulkCopyByDataTable方法中每次插入10万条,
其插入方式SqlBulkCopyOptions.UseInternalTransaction (即事务插入,可用其他方式。)
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);
} string connStr = System.Configuration.ConfigurationManager.ConnectionStrings["connStr"].ConnectionString; Stopwatch stopWatch = new Stopwatch();
stopWatch.Start(); SqlBulkCopyByDataTable(connStr, "T_Demo", dt); Console.WriteLine(stopWatch.Elapsed);
Console.ReadKey();
用时为如下。
参考: http://blog.csdn.net/xuemoyao/article/details/8506338
本文到此结束。
纯属回顾与粗谈,并没有细说。
请各位见谅。
sql 中的Bulk和C# 中的SqlBulkCopy批量插入数据 ( 回顾 and 粗谈 )的更多相关文章
- C#中的SqlBulkCopy批量插入数据
在C#中,我们可以使用sqlBulkCopy去批量插入数据,其他批量插入方法不在讨论. 1 /// <summary> 2 /// SqlBulkCopy批量插入数据 3 /// < ...
- 用SqlBulkCopy批量插入数据到SqlServer数据库表中
首先创建一个数据库连接类:SQLHelper using System; using System.Collections.Generic; using System.Linq; using Syst ...
- C#批量插入数据到Sqlserver中的四种方式
我的新书ASP.NET MVC企业级实战预计明年2月份出版,感谢大家关注! 本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的 ...
- C#批量插入数据到Sqlserver中的三种方式
本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生 成 ...
- C#_批量插入数据到Sqlserver中的四种方式
先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生成一个GUID算法所花的时间肯定比你从数据表中重新查询上一条记 ...
- C# 之 批量插入数据到 SQLServer 中
创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快.而如果存在索引的情况下,每次插入记录都会进行索引重建,这是非常耗性能的.如 ...
- C#批量插入数据到Sqlserver中的四种方式 - 转
先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生成一个GUID算法所花的时间肯定比你从数据表中重新查询上一条记 ...
- 【转载】C#批量插入数据到Sqlserver中的三种方式
引用:https://m.jb51.net/show/99543 这篇文章主要为大家详细介绍了C#批量插入数据到Sqlserver中的三种方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本篇, ...
- C# 批量插入表SQLSERVER SqlBulkCopy往数据库中批量插入数据
#region 帮助实例:SQL 批量插入数据 多种方法 /// <summary> /// SqlBulkCopy往数据库中批量插入数据 /// </summary> /// ...
随机推荐
- 图片拾取器-PicPicker
最近报名参加了360前端星计划,想当一名前端实习生,学习更多更流行的前端知识.然后需要完成一个作业,才能进培训,进了培训还得看运气才能留下,流程不少.书归正传,请看: 课后作业题目 请从下面两个题目中 ...
- VBA批量查找和复制文件
Function findAndCopy(srcFile As String, destFile As String, cmdFile As String) Dim WSH As Object, wE ...
- redis总结
redis总结 redis与memcached redis支持更多的数据结构 redis支持数据持久化 redis支持两种存储方式:snapshot(快照)和aof(append only mode) ...
- EF:自定义Oracle的映射类型
oracle在DB First模式下,int类型的字段会自动映射为decmial类型的属性. 我们可以通过自定义类型映射进行“纠整”. 在app.config 自定义映射规则: <oracle. ...
- fir.im Log Guru 正式开源,快速找到 iOS 应用无法安装的原因
很开心的宣布 Log Guru 正式开源! Log Guru,是 fir.im 开发团队创造的小轮子,用在 Mac 电脑上的日志获取,Github 地址:FIRHQ/LogGuru. Log Guru ...
- PowerDesigner成功生成PDM进行check model后的错误提示解决途径
1.existence of reference join------->缺少主键; 2.constraint name uniquesness-------->关联约束重名(refere ...
- 研究一下javascript的模块规范(CommonJs/AMD/CMD)
最近写react需要使用nodejs作为开发环境,需要通过npm安装一些第三方的依赖库,因此慢慢感觉到nodejs基础薄弱对我带来了一些不安全感,尤其是javascript模块这一块听到了很多概念,比 ...
- Owin的URL编码怎么搞?以前都是HttpUtility.UrlEncode之类的,现在连system.web都没了,肿么办?
Owin的URL编码怎么搞?以前都是HttpUtility.UrlEncode之类的,现在连system.web都没了,肿么办? 编码: Uri.EscapeDataString(name) 解码: ...
- 前端MVVM框架设计及实现(一)
最近抽出点时间想弄个dom模块化的模板引擎,不过现在这种都是MVVM自带的,索性就想自己造轮子写一个简单的MVVM框架了 借鉴的自然还是从正美的avalon开始了,我记得还是去年6月写过一个系列的av ...
- jQuery源码分析系列(34) : Ajax - 预处理jsonp
上一章大概讲了前置过滤器和请求分发器的作用,这一章主要是具体分析每种对应的处理方式 $.ajax()调用不同类型的响应,被传递到成功处理函数之前,会经过不同种类的预处理(prefilters). 预处 ...