.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. 右击“数据库”选择“还原数 ...
随机推荐
- 可变参数列表与printf()函数的实现
问题 当我们刚开始学习C语言的时候,就接触到printf()函数,可是当时"道行"不深或许不够细心留意,又或者我们理所当然地认为库函数规定这样就是这样,没有发现这个函数与普通的函数 ...
- C++-数据库【1】-C++连接MSSQL数据库
测试环境—— 系统:Win7 64bit 编译器:VC++ 2015 数据库:MSSQL 2008 R2 #include <Windows.h> #include <stdio.h ...
- SpringMvc的简单介绍
1.mcv框架要做哪些事情 (a)将url映射到java类或者Java类的方法 (b)封装用户提交的数据 (c)处理请求---调用相关的业务处理,封装响应的数据 (d)将封装的数据进行渲染,jsp,h ...
- WindowManager massge和handler
在一个可移动浮动按钮的demo源码学习中,有一些WindowManager的使用,在此做下总结. 1.翻译过来就是窗口管理,是和应用框架层的窗口管理器交互的接口,通过 mWindowManager = ...
- [BZOJ3751][NOIP2014] 解方程
Description 已知多项式方程:a0+a1*x+a2*x^2+...+an*x^n=0 求这个方程在[1,m]内的整数解(n和m均为正整数). Input 第一行包含2个整数n.m,每两个 ...
- 在安装AndroidStudio时产生的问题
JDK安装完毕,环境变量也配置完了,AndroidStudio安装完了,其中SDK使用了自己下载好的包. 但是第一次打开AndroidStudio的时候出现了错误: java.lang.Runtime ...
- Mac 终端 Linux 命令总结(简单命令)
目录操作 命令名 功能描述 使用举例 mkdir 创建一个目录 mkdir dirname rmdir 删除一个目录 rmdir dirname mvdir 移动或重命名一个目录 mvdir dir1 ...
- Python使用总结二
近来因为工作需要,用Python比较多,写得多了,收获也多.借此记录总结一下,方便以后反思. 一.IDE的选择 1.notepad++加上cmd窗口 前些时候写python脚本都用notepad++编 ...
- 转载一些Android性能优化建议
首先给出原文链接,感谢大神的经验分享:http://www.jointforce.com/jfperiodical/article/3553?utm_source=tuicool&utm_me ...
- js将数字转成大写中文
<script type="text/javascript"> //主函数 function DX(n) { if (!/^(0|[1-9]\d*)(\.\d+)?$/ ...