SqlBulkCopy高效能批量插入SQL SERVER
what
SqlBulkCopy是.NET提供的用来批量插入数据的一个类,特别是将内存中的数据一次性插入到数据库,目前只能插入到SQL SERVER数据库,数据源可以是DataTable、IDataReader
why
SqlBulkCopy插入与循环一条条插入相比,性能有巨大提升,数据越多,性能优势越明显。
测试结果:一万条数据,一条条插入要6秒,Bulk只需要0.1秒。理论上插入百万条记录也只需要1分钟以内
how
以下是测试代码:
string sourceConStr = "Data Source=192.168.1.100;Initial Catalog=A; uid=sa;pwd=sa";
string destConStr = "Data Source=.;Initial Catalog=B; uid=sa;pwd=sa"; DataTable dt = new DataTable(); public Form1()
{
InitializeComponent();
} private void button3_Click(object sender, EventArgs e)
{
dt = GetTable();
MessageBox.Show("get finish");
} private void button1_Click(object sender, EventArgs e)
{
string str = "queue start...! \n";
Stopwatch sw = new Stopwatch();
sw.Start();
CopyData(dt);
sw.Stop();
str += "queue cost time is " + sw.ElapsedMilliseconds + "\n";
richTextBox1.Text = str;
} private void button2_Click(object sender, EventArgs e)
{
string str = "bulk start...! \n";
Stopwatch sw = new Stopwatch();
sw.Start();
CopyDataBulk(dt);
sw.Stop();
str += "bulk cost time is " + sw.ElapsedMilliseconds + "\n";
richTextBox2.Text = str;
} //从数据源获取要插入的数据
private DataTable GetTable()
{
DataTable dt = new DataTable();
using (SqlConnection sourceConnection = new SqlConnection(sourceConStr))
{
sourceConnection.Open();
SqlCommand cmd = new SqlCommand("SELECT TOP 10000 CName,PersonID,Sex,Age FROM Customer order by cid asc;", sourceConnection);
cmd.CommandTimeout = 600000;
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
}
return dt;
} //一条条插入
private void CopyData(DataTable dt)
{
using (SqlConnection destinationConnection = new SqlConnection(destConStr))
{
destinationConnection.Open(); foreach(DataRow reader in dt.Rows)
{
string sql = "INSERT INTO Customer(Name,PersonID,Sex,Age) VALUES('" + reader["Cname"].ToString() + "','" + reader["PersonID"].ToString() + "','" + reader["Sex"].ToString() + "','" + reader["Age"].ToString() + "')"; SqlCommand cmd = new SqlCommand(sql, destinationConnection);
try
{
int re = cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
} //Bulk插入
private void CopyDataBulk(DataTable dt)
{
using (SqlConnection destinationConnection = new SqlConnection(destConStr))
{
destinationConnection.Open(); using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection))
{ //写对应关系。如旧表的CName列的数据,对应新表Name列
bulkCopy.ColumnMappings.Add("CName", "Name"); //设置目标表名
bulkCopy.DestinationTableName = "Customer"; try
{
bulkCopy.WriteToServer(dt);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
// reader.Close();
}
} }
}
SqlBulkCopy高效能批量插入SQL SERVER的更多相关文章
- [转]如何写出高效能TSQL -深入浅出SQL Server Relational Engine (含 SQL 2014 in-memory Engine)
[转]如何写出高效能TSQL -深入浅出SQL Server Relational Engine (含 SQL 2014 in-memory Engine) http://blogs.technet. ...
- Python批量插入SQL Server数据库
因为要做性能测试,需要大量造数据到数据库中,于是用python写了点代码去实现,批量插入,一共四张表 简单粗暴地插入10万条数据 import pymssql import random __auth ...
- 将DataTable 数据插入 SQL SERVER 数据库
原文:将DataTable 数据插入 SQL SERVER 数据库 以下提供3中方式将DataTable中的数据插入到SQL SERVER 数据库: 一:使用sqlcommand.executenon ...
- 使用SqlBulkCopy导入数据至MS SQL Server
原文:使用SqlBulkCopy导入数据至MS SQL Server Insus.NET一直使用表类型来数据入MS SQL Server.参考<存储过程参数为DataTable>http: ...
- ASP.NET(C#) 使用 SqlBulkCopy 实现批量插入SQL(快捷简单)
业务需要,系统在处理数据时,每暂存一列数据将他插入到右侧的表格中,再执行批量保存,如图所示: //以前的做法可能是生成一堆 insert into xx values xxx 的sql语句,在程序中去 ...
- (转)批量插入sql语句
为了减少数据库连接的I/O开销,一般会把多条数据插入放在一条SQL语句中一次执行.1.INSERT INTO TABLE(col1, col2) VALUES(val11, val12), (val2 ...
- C# 封装SqlBulkCopy,让批量插入更方便
关于 SqlServer 批量插入的方式,前段时间也有大神给出了好几种批量插入的方式及对比测试(http://www.cnblogs.com/jiekzou/p/6145550.html),估计大家也 ...
- 聊聊编程开发的数据库批量插入(sql)
这里的批量插入,主要是支持SQL的大型存储数据库,本文以Mysql,Oracle,SqlServer,postgresql4类来说明,这大概是国内应用比较多的了.其余的应该可以按照这些去找.提到编程的 ...
- asp.net插入sql server 中文乱码问题解决方案
创建数据库的代码---创建promary表 create table promary ( proID int primary key, proName varchar(50) not null ) 出 ...
随机推荐
- Android 应用自动更新功能的代码
由于Android项目开源所致,市面上出现了N多安卓软件市场.为了让我们开发的软件有更多的用户使用,我们需要向N多市场发布,软件升级后,我们也必须到安卓市场上进行更新,给我们增加了工作量.因此我们有必 ...
- 【HDOJ】1260 Tickets
水DP,不过这道题目的数据好像有问题.24时制可表示范围是0~23,12时制可表示范围应为1~12.也就是说24点(即0点)其实表示为12:00:00am,而中午12:00:00其实表示为12:00: ...
- Service Oriented Architecture
What is Service Oriented Architecture (SOA)? There have been so many interpretations of this through ...
- NOI2010超级钢琴
超级钢琴 [问题描述] 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度 ...
- nginx 去掉服务器版本和名称和nginx_status 状态说明
可能有时候我们看某些站点想知道别人在使用什么版本的web服务器之类的信息时,却发现并未显示版本号,甚至连WEB服务器都有变化,可以通过以下方法来隐藏Nginx.PHP的版本号信息,来提升一定的安全性: ...
- 【转】Mac用户必备!100多款免费实用的苹果Mac软件大搜集
原文网址:http://www.iplaysoft.com/100-mac-freeware.html 对于 Mac 新手,尤其是刚刚从 Windows 转到 Mac OS X 的用户来说,最大的痛苦 ...
- 【转】ubuntu 12.04英文版设置成中文版
原文网址:http://blog.csdn.net/hhbgk/article/details/7958776 适用于ubuntu 12.04英文版的系统,其它版本的设置应该是大同小异的. 进入ubu ...
- HTMLPARSER.NET 参考资料
例子1: using System;using System.IO;using Winista.Text.HtmlParser;using Winista.Text.HtmlParser.Lex;us ...
- C# winform自定义Label控件使其能设置行距
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- Mealy和moore型状态机
Moore型状态机:下一状态只由当前状态决定,即次态=f(现状,输入),输出=f(现状): Mealy型状态机:下一状态不但与当前状态有关,还与当前输入值有关,即次态=f(现状,输入),输出=f(现状 ...