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的更多相关文章

  1. [转]如何写出高效能TSQL -深入浅出SQL Server Relational Engine (含 SQL 2014 in-memory Engine)

    [转]如何写出高效能TSQL -深入浅出SQL Server Relational Engine (含 SQL 2014 in-memory Engine) http://blogs.technet. ...

  2. Python批量插入SQL Server数据库

    因为要做性能测试,需要大量造数据到数据库中,于是用python写了点代码去实现,批量插入,一共四张表 简单粗暴地插入10万条数据 import pymssql import random __auth ...

  3. 将DataTable 数据插入 SQL SERVER 数据库

    原文:将DataTable 数据插入 SQL SERVER 数据库 以下提供3中方式将DataTable中的数据插入到SQL SERVER 数据库: 一:使用sqlcommand.executenon ...

  4. 使用SqlBulkCopy导入数据至MS SQL Server

    原文:使用SqlBulkCopy导入数据至MS SQL Server Insus.NET一直使用表类型来数据入MS SQL Server.参考<存储过程参数为DataTable>http: ...

  5. ASP.NET(C#) 使用 SqlBulkCopy 实现批量插入SQL(快捷简单)

    业务需要,系统在处理数据时,每暂存一列数据将他插入到右侧的表格中,再执行批量保存,如图所示: //以前的做法可能是生成一堆 insert into xx values xxx 的sql语句,在程序中去 ...

  6. (转)批量插入sql语句

    为了减少数据库连接的I/O开销,一般会把多条数据插入放在一条SQL语句中一次执行.1.INSERT INTO TABLE(col1, col2) VALUES(val11, val12), (val2 ...

  7. C# 封装SqlBulkCopy,让批量插入更方便

    关于 SqlServer 批量插入的方式,前段时间也有大神给出了好几种批量插入的方式及对比测试(http://www.cnblogs.com/jiekzou/p/6145550.html),估计大家也 ...

  8. 聊聊编程开发的数据库批量插入(sql)

    这里的批量插入,主要是支持SQL的大型存储数据库,本文以Mysql,Oracle,SqlServer,postgresql4类来说明,这大概是国内应用比较多的了.其余的应该可以按照这些去找.提到编程的 ...

  9. asp.net插入sql server 中文乱码问题解决方案

    创建数据库的代码---创建promary表 create table promary ( proID int primary key, proName varchar(50) not null ) 出 ...

随机推荐

  1. 【HDOJ】2155 小黑的镇魂曲

    线段树+SPFA最短路可以过.或者DP也能过.需要注意的是xl的范围是错的,测试用例中xl可能为0,他妈的,因为这个一直莫名其妙的wa.1. spfa建图增加一倍的点即可(讨论左端点和右端点). /* ...

  2. mac book air 装win7

    1. 使用mac book air A1465中 bootCamp制作启动U盘: 需要U盘一个8G,windows 7 原版镜像ISO安装文件一个,根据bootcamp操作提示选择文件及U盘, 注意U ...

  3. 创建通用型framework

    http://years.im/Home/Article/detail/id/52.html http://www.cocoachina.com/industry/20131204/7468.html ...

  4. web.xml配置详解之欢迎页面和错误页面

    <!-- 应用的欢迎页面  采用list的方式罗列欢迎页面, 系统会从第一个找到最后一个,找到了文件就不继续往下找了.优先显示前边的. --> <welcome-file-list& ...

  5. C# String.Format大全

    C# String.Format大全 ? ? ? 十进制的数字 ? ? string.Format("{0:D3}",23) 023 格式化十进制的数字 string.Format ...

  6. Java开发心得

    1. Spring概述 Spring 是一个开源框架,是为了解决企业应用程序开发复杂性由Rod Johnson创建的.框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J ...

  7. Git branch (分支学习)

    以前总结的一些git操作,分享在这里. Git 保存的不是文件差异或者变化量,而只是一系列文件快照.   - 列出当前所有分支 git branch <--merge> | <--n ...

  8. Flex 箭头(军标)库封装完成

    封装的一个月,在这个月期间还完成的一些其它的工作:公司有规定不能公布代码,我可以讲一下大致的流程,真的很抱歉! 1.用B样条曲线画箭头的两侧的曲线,这个要注意了,不要贝塞尔曲线,因为贝塞尔曲线的算法会 ...

  9. 关于NSLocalizedString(@"Foo %@",nil)

    NSLocalizedString(@"Foo %@",nil) 这句话实际上是在多语言文件中寻找一个key为“Foo %@”的文字,千万不要把这个和[NSString strin ...

  10. str*函数和大小端判断

    #include <stdio.h> #include <assert.h> size_t mstrlen(const char *s) { assert(s != NULL) ...