SqlBulkCopy提供了一种将数据复制到Sql Server数据库表中高性能的方法。SqlBulkCopy 包含一个方法 WriteToServer,它用来从数据的源复制数据到数据的目的地。 WriteToServer方法可以处理的数据类型有DataRow[]数组,DataTable 和 DataReader。 你可以根据不同的情形使用不同的数据类型。SqlBulkCopy其原理是采用了SQL Server的BCP协议进行数据的批量复制。

SqlBulkCopy(批量复制):批量复制速度极快

        /// <summary>
/// 数据库中的表复制到另一个数据库中的表
/// </summary>
private static void SqlBulkCopyMethod(string connectionStr1, string connectionStr2)
{
try
{
using (SqlConnection connetionPub = new SqlConnection(connectionStr1))
{
SqlCommand commandPub = connetionPub.CreateCommand();
using (commandPub)
{
commandPub.CommandText = "select top 100 * from Person";
commandPub.CommandType = System.Data.CommandType.Text;
connetionPub.Open(); SqlConnection connectionBulkCopy = new SqlConnection(connectionStr2);
using (connectionBulkCopy)
{
connectionBulkCopy.Open();
SqlDataReader dataReader = commandPub.ExecuteReader();
SqlBulkCopy bulkCopy = new SqlBulkCopy(connectionBulkCopy);
using (bulkCopy)
{
bulkCopy.BulkCopyTimeout = ;
bulkCopy.BatchSize = ;//BatchSize的意思就是同每一批次中的行数,在每一批次结束时,就将该批次中的行发送到数据库
bulkCopy.NotifyAfter = ;
bulkCopy.SqlRowsCopied += new SqlRowsCopiedEventHandler(bulkCopy_SqlRowsCopied);//bulkCopy对象提供了一个SqlRowCopied事件,在每次处理完NotifyAfter属性指定的行数时发生
bulkCopy.DestinationTableName = "Person";
bulkCopy.WriteToServer(dataReader);
}
}
}
}
}
catch (Exception ex)
{
throw ex;
}
}
public static void bulkCopy_SqlRowsCopied(object obj, SqlRowsCopiedEventArgs e)
{
//执行事件处理方法
}
        /// <summary>
/// 将表中资料批量插入到数据库
/// </summary>
/// <param name="connectionString"></param>
/// <param name="TableName"></param>
/// <param name="dt"></param>
private void SqlBulkCopyByDatatable(string connectionString, DataTable dt)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
using (SqlBulkCopy sqlbulkcopy = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.UseInternalTransaction))
{
try
{
sqlbulkcopy.DestinationTableName = "Person";
for (int i = ; i < dt.Columns.Count; i++)
{
sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
}
sqlbulkcopy.WriteToServer(dt);
}
catch (System.Exception ex)
{
throw ex;
}
}
}
}
        /// <summary>
/// 不同表之间复制数据
/// </summary>
private static void PerformBulkCopyDifferentSchema(string connectionString)
{
var stopwatch = new Stopwatch();
DataTable sourceData = new DataTable();
// 源
stopwatch.Start();
using (SqlConnection sourceConnection = new SqlConnection(connectionString))
{
SqlCommand myCommand = new SqlCommand("SELECT * FROM Person", sourceConnection);
sourceConnection.Open();
SqlDataReader reader = myCommand.ExecuteReader();
// 目的
using (SqlConnection destinationConnection = new SqlConnection(connectionString))
{
// 打开连接
destinationConnection.Open();
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connectionString))
{
bulkCopy.ColumnMappings.Add("PersonId", "NEW_PersonId");
bulkCopy.ColumnMappings.Add("Name", "NEW_Name");
bulkCopy.ColumnMappings.Add("Age", "NEW_Age");
bulkCopy.DestinationTableName = "New_Person";
bulkCopy.WriteToServer(reader);
}
}
Console.WriteLine(stopwatch.ElapsedMilliseconds);
reader.Close();
}
}
        /// <summary>
/// 使用XML作为数据源
/// </summary>
private static void PerformBulkCopyXMLDataSource(string connectionString)
{
DataSet ds = new DataSet();
DataTable sourceData = new DataTable();
ds.ReadXml(@"E:\Study\SQL\MSSQL\MSSQL_SqlBulkCopy\MSSQL_SqlBulkCopy\PersonFile.xml");
sourceData = ds.Tables[];
// 目的
using (SqlConnection destinationConnection = new SqlConnection(connectionString))
{
// 打开连接
destinationConnection.Open();
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connectionString))
{
// 列映射
//bulkCopy.ColumnMappings.Add("PersonId", "NEW_PersonId");
//bulkCopy.ColumnMappings.Add("Name", "NEW_Name");
//bulkCopy.ColumnMappings.Add("Age", "NEW_Age");
bulkCopy.DestinationTableName = "New_Person";
bulkCopy.WriteToServer(sourceData);
}
}
}

SqlDataAdapter  Update:适用于批量更新数据

        /// <summary>
/// SqlDataAdapter Update
/// </summary>
private static void PerformSqlDataAdapterUpdate(string connectionString)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
DataSet ds = new DataSet();
DataSet ds_new = new DataSet();
string SQLstr = "Select top 100 * from Person";
string SQLstr_new = "Select top 0 * from New_Person";
conn.Open();
SqlCommand comm = new SqlCommand(SQLstr_new, conn);
SqlDataAdapter sad = new SqlDataAdapter(comm);
SqlCommandBuilder scb = new SqlCommandBuilder(sad);
sad.Fill(ds_new);
SqlDataAdapter sda = new SqlDataAdapter(new SqlCommand(SQLstr, conn));
sda.Fill(ds);
for (int i = ; i < ds.Tables[].Rows.Count; i++)
{
DataRow NewRow = ds_new.Tables[].NewRow();
NewRow[] = ds.Tables[].Rows[i][];
NewRow[] = ds.Tables[].Rows[i][];
NewRow[] = ds.Tables[].Rows[i][]; ds_new.Tables[].Rows.Add(NewRow);
}
// ds_new.AcceptChanges();
sad.Update(ds_new.GetChanges());
}
}

代码:http://files.cnblogs.com/files/imhaiyang/MSSQL_SqlBulkCopy.rar

转载:http://www.cnblogs.com/scottckt/archive/2011/02/16/1955862.html

SqlBulkCopy(批量复制)使用方法 && SqlDataAdapter Update的更多相关文章

  1. SqlBulkCopy(批量复制)使用方法

    SqlBulkCopy提供了一种将数据复制到Sql Server数据库表中高性能的方法.SqlBulkCopy 包含一个方法 WriteToServer,它用来从数据的源复制数据到数据的目的地. Wr ...

  2. SqlBulkCopy 批量复制数据到数据表

    使用 SqlBulkCopy 类只能向 SQL Server 表写入数据.但是,数据源不限于 SQL Server:可以使用任何数据源,只要数据可加载到 DataTable 实例或可使用 IDataR ...

  3. (转)SqlBulkCopy批量复制数据

    在.Net1.1中无论是对于批量插入整个DataTable中的所有数据到数据库中,还是进行不同数据源之间的迁移,都不是很方便.而 在.Net2.0中,SQLClient命名空间下增加了几个新类帮助我们 ...

  4. SqlBulkCopy 批量复制数据到数据库

    1.简介 1.MSDN 核心方法:SqlBulkCopy.WriteToServer 将所有行从数据源复制到 SqlBulkCopy 对象的 DestinationTableName 属性指定的目标表 ...

  5. 【C#-批量插入数据到数据库】DataTable数据批量插入数据的库三种方法:SqlCommand.EcecuteNonQurery(),SqlDataAdapter.Update(DataTable) ,SqlBulkCopy.WriteToServer(Datatable)

    第一种方法:使用SqlCommand.EcecuteNonQurery()  效率最慢 第二种方法:使用SqlDataAdapter.Update(DataTable)   效率次之 第三种方法:使用 ...

  6. C# 使用 SqlBulkCopy 类批量复制数据到数据库

    最近公司需要优化导入的问题,由于之前使用的方式是生成 Insert 语句插入数据库,数据量小的时候还行,但是随着发展数据量渐渐大了,之前的方法性能就跟不上了,于是发现了 SqlBulkCopy 这个类 ...

  7. SqlDataAdapter.Update批量数据更新

    SqlDataAdapter.Update批量数据更新 使用SqlDataAdapter.Update可以方便地对数据库进行快速.批量数据更新.我们最常用的多条数据更新方法是使用循环多次执行SQL语句 ...

  8. 用.net中的SqlBulkCopy类批量复制数据 (转载)

    在软件开发中,把数据从一个地方复制到另一个地方是一个普遍的应用. 在很多不同的场合都会执行这个操作,包括旧系统到新系统的移植,从不同的数据库备份数据和收集数据. .NET 2.0有一个SqlBulkC ...

  9. 使用asp.net 2.0中的SqlBulkCopy类批量复制数据

    介绍:在软件开发中,把数据从一个地方复制到另一个地方是一个普遍的应用. 在很多不同的场合都会执行这个操作,包括旧系统到新系统的移植,从不同的数据库备份数据和收集数据. ASP.NET 2.0有一个Sq ...

随机推荐

  1. 基于spring及zookeeper的dubbo工程搭建

    一.生产者搭建 新建一个maven工程,勾选Create a simple project Packaging方式选择jar包的方式. 修改pom.xml文件: <project xmlns=& ...

  2. spring事务-说说Propagation及其实现原理

    前言 spring目前已是java开发的一个事实标准,这得益于它的便利.功能齐全.容易上手等特性.在开发过程当中,操作DB是非常常见的操作,而涉及到db,就会涉及到事务.事务在平时的开发过程当中,就算 ...

  3. bae3.0第三步 添加默认管理后台模块和mysql库

    1.创建数据库 先在本地的mysql数据库中创建数据库db_blog,执行python manage.py syncdb来创建表. 然后将数据库中的表导入到bae上的数据库中.2.配置数据库 修改项目 ...

  4. Azure SLB + httpd + ILB + HAProxy + Atlas + MySQL

    为了测试一个环境,需要在Azure上搭建高可用的LAMP架构.但要求MySQL的中间件Atlas采用主备的模式.在数据中心一般采用Keepalive+VIP的模式,通过浮动地址对外提供服务. 但在云环 ...

  5. laravel 添加自定义类 全局自定义方法 自定义常量

    添加自定义类 https://blog.csdn.net/suchfool/article/details/38758367 https://blog.csdn.net/liukai6/article ...

  6. asp.net过滤HTML标签,只保留换行与空格

    自己从网上找了一个过滤HTML标签的方法,我也不知道谁的才是原创的,反正很多都一样.我把那方法复制下来,代码如下: /// <summary> /// 去除HTML标记 /// </ ...

  7. QtCreator开启-O编译优化的方式

    首先,编译优化必须是在Release模式下进行,保证程序没有任何bug的条件下进行执行.编译优化能极大提升程序的运行效率,级别越高速度越快,但是对代码健壮性要求也越高! 选择编译release模式,在 ...

  8. PHP7卓越性能背后的原理有哪些?

    作者:韩天峰链接:http://www.zhihu.com/question/38148900/answer/75115687来源:知乎 PHP7在运行原理上与PHP5相比并没有变化,这与hhvm不同 ...

  9. Swing编程中为什么对Panel设置了位置后,它的lable位置也跟这变了呢?

    总结: package com.da; //这里我不明白,我对每一个Panle里的按钮设置了位置BorderLayout.SOUTH.可是为什么Lable的位置和它一样同步设置了呢? //做一个界面 ...

  10. How far away ?(LCA)dfs和倍增模版

    How far away ? Tarjan http://www.cnblogs.com/caiyishuai/p/8572859.html Time Limit: 2000/1000 MS (Jav ...