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

最新文章

  1. [LeetCode] Spiral Matrix 螺旋矩阵
  2. Docker - 技术栈
  3. Python 基礎 - 文件的操作
  4. python 字节与字符串转换
  5. MySQL~ IN , FIND_IN_SET , LIKE
  6. Ural 1018 (树形DP+背包+优化)
  7. PHP 统计中文字符串的长度
  8. DOS批处理命令-几个固定名称的变量
  9. C/C++中的变量作用域
  10. javascript循环
  11. 密封关键字sealed
  12. Oarcle 之DML
  13. Laravel 5 中使用 Laravel Excel 实现 Excel/CSV 文件导入导出功能
  14. Unity Profiler连接Android真机调试
  15. [转]分析MySQL数据类型的长度【mysql数据字段 中length和decimals的作用!熟悉mysql必看】
  16. 微信小程序接入腾讯云IM即时通讯(会话列表)
  17. Blender之OBJ转json
  18. 【黑金ZYNQ7000系列原创视频教程】06.ZYNQ来自FPGA的中断&mdash;&mdash;按键中断实验
  19. egg.js npm start 启动报错
  20. GitHub个人使用入门

热门文章

  1. bzoj 1951 [Sdoi2010]古代猪文 ——数学综合
  2. git公钥生成以及与coding等联合
  3. 在centos阿里云服务器上安装配置php运行环境 安装php7
  4. 蓝桥杯 基础练习 BASIC-15 字符串对比
  5. DCloud:目录
  6. 【OpenCV】基于图像处理和模式识别的火灾检测方法
  7. linux yum 脚本实现
  8. php字符型转整型
  9. java 多线程系列基础篇(六)之线程让步
  10. DDD学习笔录——领域驱动设计的常见误区(即错误的理解)