.Net批量插入数据到SQLServer数据库,System.Data.SqlClient.SqlBulkCopy类批量插入大数据到数据库
批量的的数据导入数据库中,尽量少的访问数据库,高性能的对数据库进行存储。
采用SqlBulkCopy来处理存储数据。SqlBulkCopy存储大批量的数据非常的高效,将内存中的数据表直接的一次性的存储到数据库中,而不需要一次一次的向数据库Insert数据。
经过几次实验,百万级别的数据表,也只需几秒时间内就可以完全的存入数据库中,其速度,比传统的Insert into方法不止快很多倍。
下面看代码:
/// <summary>
/// 批量插入数据
/// </summary>
/// <param name="connectionString">连接数据库字符串</param>
/// <param name="tableName">表名称</param>
/// <param name="dt">需要批量插入数据库DataTable数据源</param>
/// <param name="bulkCopyTimeout">连接数据库的溢出时间</param>
/// <returns></returns>
public static bool SqlBulkCopyByDatatable(string connectionString, string tableName, DataTable dt, int bulkCopyTimeout = )
{
try
{
using (SqlBulkCopy sqlbulkCopy = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.UseInternalTransaction))
{
sqlbulkCopy.DestinationTableName = tableName;
sqlbulkCopy.BulkCopyTimeout = bulkCopyTimeout;
for (int i = ; i < dt.Columns.Count; i++)
{
sqlbulkCopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
}
sqlbulkCopy.WriteToServer(dt);
sqlbulkCopy.Close();//关闭连接
return true;
}
}
catch (System.Exception ex)
{
throw ex;
} } /// <summary>
/// 批量插入数据
/// </summary>
/// <param name="connectionString">连接数据库字符串</param>
/// <param name="tableName">表名称</param>
/// <param name="dt">需要批量插入数据库DataTable数据源</param>
/// <param name="batchSize">一次批量插入多少条数据</param>
/// <param name="bulkCopyTimeout">连接数据库的溢出时间</param>
/// <returns></returns>
public static bool SqlBulkCopyByDatatable(string connectionString, string tableName, DataTable dt, int batchSize,int bulkCopyTimeout=)
{
try
{
using (SqlBulkCopy sqlbulkCopy = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.UseInternalTransaction))
{
sqlbulkCopy.BatchSize = batchSize;
sqlbulkCopy.DestinationTableName = tableName;
sqlbulkCopy.BulkCopyTimeout = bulkCopyTimeout;
for (int i = ; i < dt.Columns.Count; i++)
{
sqlbulkCopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
}
sqlbulkCopy.WriteToServer(dt);
sqlbulkCopy.Close();//关闭连接
return true;
}
}
catch (System.Exception ex)
{
throw ex;
} }
使用例子:
1、创建一个数据库、和一个数据表
create database TestBatchOperateMssqlserverDB;
go
use TestBatchOperateMssqlserverDB;
go
CREATE TABLE Product(
ProductId BIGINT identity(1,1) PRIMARY KEY,
ProductName VARCHAR(50) NOT NULL,
Price MONEY NOT NULL
)
2、建立和数据表结构相同的Datatable
System.Data.DataTable dt = new System.Data.DataTable(); //表的结构要和数据库一样
dt.Columns.AddRange(new System.Data.DataColumn[]
{
new System.Data.DataColumn("ProductId",typeof(long)), //自增
new System.Data.DataColumn("ProductName",typeof(string)),
new System.Data.DataColumn("Price",typeof(decimal))
});
3、为dataTable装配数据
for (int i = ; i < ; i++)
{
System.Data.DataRow dr = dt.NewRow();
//dr[0] = i; //自增
dr[] = string.Format("商品{0}", i);
dr[] = (decimal)i;
dt.Rows.Add(dr);
}
4、将数据插入到数据库
SqlBulkCopyByDatatable("server=.;database=TestBatchOperateMssqlserverDB;uid=sa;pwd=123456" , "Product", dt);
.Net批量插入数据到SQLServer数据库,System.Data.SqlClient.SqlBulkCopy类批量插入大数据到数据库的更多相关文章
- 数据库还原,System.Data.SqlClient.SqlError: 因为数据库正在使用,所以无法获得对数据库的独占访问权。 (Microsoft.SqlServer.SmoExtended)
数据库还原问题: System.Data.SqlClient.SqlError: 因为数据库正在使用,所以无法获得对数据库的独占访问权. (Microsoft.SqlServer.SmoExtende ...
- 在SQL SERVER 2005中还原数据库时出现错误:system.data.sqlclient.sqlerror 媒体集有 2 个媒体簇 但只提供了 1 个。必须提供所有成员。 (microsoft.sqlserver.smo)
问题:在SQL SERVER 2005中还原数据库时出现错误:system.data.sqlclient.sqlerror 媒体集有 2 个媒体簇 但只提供了 1 个.必须提供所有成员. (micro ...
- C# 使用SqlBulkCopy类批量复制大数据
用途说明: 前些日子,公司要求做一个数据导入程序,要求将Excel数据,大批量的导入到数据库中,尽量少的访问数据库,高性能的对数据库进行存储.于是在网上进行查找,发现了一个比较好的解决方案,就是采用S ...
- System.Data.SqlClient.SqlError: 尚未备份数据库的日志尾部
SQL还原时出现下面的错误,System.Data.SqlClient.SqlError: 尚未备份数据库 "***" 的日志尾部.如果该日志包含您不希望丢失的工作,请使用 BAC ...
- 出现“System.Data.SqlClient.SqlError: 尚未备份数据库的日志尾部”错误的解决方案
Sql Server2008数据库在还原时出现如下错误信息:System.Data.SqlClient.SqlError: 尚未备份数据库<数据库名称>的日志尾部.如果该日志包含您不希望丢 ...
- 还原数据库“XXX”时失败。System.Data.SqlClient.SqlError: 无法执行 BACKUP LOG,因为当前没有数据库备份。
标题: Microsoft SQL Server Management Studio------------------------------ 还原数据库“GoldBellXZDepot”时失败. ...
- 用.net中的SqlBulkCopy类批量复制数据 (转载)
在软件开发中,把数据从一个地方复制到另一个地方是一个普遍的应用. 在很多不同的场合都会执行这个操作,包括旧系统到新系统的移植,从不同的数据库备份数据和收集数据. .NET 2.0有一个SqlBulkC ...
- System.data.sqlclient.sqlexception:将截断字符串或二进制数据终止
System.data.sqlclient.sqlexception:将截断字符串或二进制数据终止. 错误原因:输入的字符串长度超过数据库设置的长度
- System.Data.SqlClient.SqlError: 备份集中的数据库备份与现有的 'XXX' 数据库不同
System.Data.SqlClient.SqlError: 备份集中的数据库备份与现有的 'XXX' 数据库不同. 1. 删除与要恢复数据库同名的已经存在的数据库:2. 右击“数据库”选择“还原数 ...
随机推荐
- select2 清空数据
最近用select2插件,发现用jquery重置不好使,最后搜罗了一把发现下面这个方法可以间接的实现,有空还得看看插件的API $('#integratorId').select2('data', n ...
- 2.1 -1.0 Xcode(发布时间、使用、快捷键、插件相关)
本文并非最终版本,如有更新或更正会第一时间置顶,联系方式详见文末 如果觉得本文内容过长,请前往本人 “简书” 1.0 Xcode 发布时间 版本 iOS 版本 手机 日期 特殊介绍 Xcode 3.1 ...
- 前端性能优化--为什么DOM操作慢?
作为一个前端,不能不考虑性能问题.对于大多数前端来说,性能优化的方法可能包括以下这些: 减少HTTP请求(合并css.js,雪碧图/base64图片) 压缩(css.js.图片皆可压缩) 样式表放头部 ...
- content相关属性
content属性值 : width:可视区域的宽度,值可为数字或关键词device-width height:同width intial-scale:页面首次被显示是可 ...
- [Android] Shape背景制作半圆或半边框
实现原理使用layer-list对shape进行叠加显示. 直接上代码: <layer-list xmlns:android="http://schemas.android.com/a ...
- C,C++
C与C++的Struct有何区别,Java有Struct吗,C++里Struct与Class区别: C++虚析构函数作用: static静态变量初始化: 深复制与浅复制区别: const * int ...
- dubbo 常见错误
1. Caused by: java.lang.reflect.MalformedParameterizedTypeException 或 Caused by: java.lang.NoSuchMet ...
- git回滚错误提交
git log //找到你要回滚的那次提交 比如:43596f6b1f57157e627c25ae7a843f60157ac52d git reset --hard HEAD~43596f6b1f57 ...
- 微信第三方平台定时接收component_verify_ticket
背景: 获取第三方平台令牌(component_access_token),增加了component_verify_ticket参数.component_verify_ticket由公众平台每隔10分 ...
- 在cmd命令行使用Maven Archetype插件 generate命令创建简单的java web项目
前提: 1.下载apache-maven:https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache ...