SqlBulkCopy(批量复制)使用方法 && SqlDataAdapter Update

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 = 3600;
                                bulkCopy.BatchSize = 300000;//BatchSize的意思就是同每一批次中的行数,在每一批次结束时,就将该批次中的行发送到数据库
                                bulkCopy.NotifyAfter = 1;
                                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 = 0; 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[0];
            // 目的
            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 = 0; i < ds.Tables[0].Rows.Count; i++)
                {
                    DataRow NewRow = ds_new.Tables[0].NewRow();
                    NewRow[0] = ds.Tables[0].Rows[i][0];
                    NewRow[1] = ds.Tables[0].Rows[i][1];
                    NewRow[2] = ds.Tables[0].Rows[i][2];

                    ds_new.Tables[0].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

时间: 2024-08-24 08:49:45

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

SqlBulkCopy(批量复制)使用方法

轉載: SqlBulkCopy(批量复制)使用方法 Posted on 2011-02-16 11:01 宽田 阅读(3510) 评论(0) 编辑 收藏 SqlBulkCopy提供了一种将数据复制到Sql Server数据库表中高性能的方法.SqlBulkCopy 包含一个方法 WriteToServer,它用来从数据的源复制数据到数据的目的地. WriteToServer方法可以处理的数据类型有DataRow[]数组,DataTable 和 DataReader. 你可以根据不同的情形使用不同

SqlBulkCopy 批量复制数据到数据表

使用 SqlBulkCopy 类只能向 SQL Server 表写入数据.但是,数据源不限于 SQL Server:可以使用任何数据源,只要数据可加载到 DataTable 实例或可使用 IDataReader 实例读取数据 使用Datatable作为数据源的方式: 下面的代码使用到了ColumnMappings,因为目标表和数据源Datatable的结构不一致,需要这么一个映射来指定对应关系 public string SaveJHCData(LzShopBasicData[] datas)

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

介绍:在软件开发中,把数据从一个地方复制到另一个地方是一个普遍的应用. 在很多不同的场合都会执行这个操作,包括旧系统到新系统的移植,从不同的数据库备份数据和收集数据. ASP.NET 2.0有一个SqlBulkCopy类,它可以帮助你从不同的数据源复制数据到SQL SERVER数据库. 本文中我将示范SqlBulkCopy类的不同应用. 数据库设计: 这个数据库的设计还是蛮简单的,它基于Northwind数据库的Products表.另外我还在Northwind数据库中创建了3个表. 详情可以看一

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

最近公司需要优化导入的问题,由于之前使用的方式是生成 Insert 语句插入数据库,数据量小的时候还行,但是随着发展数据量渐渐大了,之前的方法性能就跟不上了,于是发现了 SqlBulkCopy 这个类. 使用 SqlBulkCopy 类只能向 SQL Server 表写入数据.但是,数据源不限于 SQL Server:可以使用任何数据源,只要数据可加载到 DataTable 实例或可使用 IDataReader 实例读取数据. public class Conn { private static

SqlDataAdapter.Update批量数据更新

使用SqlDataAdapter.Update可以方便地对数据库进行快速.批量数据更新.我们最常用的多条数据更新方法是使用循环多次执行SQL语句或存储过程,这样虽然方便,但由于连接和数据传递要在服务器和客户端多次来往,大大增加了整个过程的时间,当数据越大时越明显! 下面对SqlDataAdapter.Update作个简单的演示介绍吧. 测试环境:SqlServer2008+VS2010+WinXP 1.建立测试数据库和表 CREATE DATABASE [TEST]GO USE [Test]GO

使用SqlBulkCopy类来批量复制数据

DataTable dt = new DataTable(); dt.Columns.Add("id", typeof(string)); for (int i = 0; i < 100; i++) { DataRow dr = dt.NewRow(); dr["id"] = "sadf" + i; dt.Rows.Add(dr); } using (SqlConnection conn = new SqlConnection(@"

SqlServer批量复制(bcp)[C#SqlBulkCopy]性能极低问题

背景 最近一段给xx做项目,这边最头疼的事情就是数据库入库瓶颈问题. 环境 服务器环境:虚拟机,分配32CPU,磁盘1.4T,4T,5T,6T几台服务器不等同(转速都是7200r),内存64G. 排查步骤 排查一:数据库恢复模式为简单模式,数据库和tempdb的初始大小.数据库文件初始化大小100G,日志文件初始化大小50G,两个文件都是自动增长(按10%):tempdb初始化大小10G*4个文件,日志5G*4个文件,两个文件都是自动增长(按10%),分布在两个磁盘中(但看了这篇文章后,有点傻眼

【转】批量复制操作(SqlBulkCopy)的出错处理:事务提交、回滚

原文地址:http://blog.csdn.net/westsource/article/details/6658109 默认情况下,批量复制操作作为独立的操作执行. 批量复制操作以非事务性方式发生,不可能使其回滚. 如果需要在出错时回滚全部批量复制或它的一部分,可以使用 SqlBulkCopy 托管的事务,在现有事务中执行批量复制操作,或者在 System.Transactions Transaction 中登记它. 由于不同批次在不同事务中执行,因此,如果在批量复制操作期间发生错误,则当前批

SqlBulkCopy批量插入数据时,不执行触发器和约束的解决方法

原文:SqlBulkCopy批量插入数据时,不执行触发器和约束的解决方法 在new SqlBulkCopy对象的时候,设置一下SqlBulkCopyOptions选项即可,按位或运算 SqlBulkCopyOptions.FireTriggers | SqlBulkCopyOptions.CheckConstraints using (SqlBulkCopy bulkCopy = new SqlBulkCopy(GlobalString.ConnectionString, SqlBulkCopy