SqlBulkCopy 小试牛刀

本文介绍如何使用 C# 和 SqlBulkCopy 类将 SQL Server 中的一个表(Table_1)的数据迁移到另一个表(Table_2)。通过创建表结构、插入数据,并实现数据迁移的过程,展示了具体的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考文章: 点击打开链接


上面的文章有用, 但不太清晰, 重新做了个比较清晰的。


假设要将一个库中的 Table_1 表复制到 另一个库的 Table_2 表。 数据来源表与目标表如下:

--1. 建数据来源表
IF EXISTS (  
       SELECT 1 FROM   sysobjects  
       WHERE  id = OBJECT_ID(N'Table_1')  
              AND OBJECTPROPERTY(id, N'IsUserTable') = 1  
   )  
BEGIN  
    DROP TABLE Table_1  
END  
GO  
Create Table Table_1(	
	ID INT, 
	[NAME] VARCHAR(50)
)
GO
INSERT INTO Table_1
SELECT 1,'a' UNION
SELECT 2,'b' UNION
SELECT 3,'c' UNION
SELECT 4,'d' UNION
SELECT 5,'e' UNION
SELECT 6,'f'

--2. 建目标表
IF EXISTS (  
       SELECT 1 FROM   sysobjects  
       WHERE  id = OBJECT_ID(N'Table_2')  
              AND OBJECTPROPERTY(id, N'IsUserTable') = 1  
   )  
BEGIN  
    DROP TABLE Table_2  
END  
GO  
Create Table Table_2(	
	ID2 INT, 
	[NAME2] VARCHAR(50)
)
GO

--复制时的对应关系
--Tabe_1 ==> Table_2
--ID     ==> ID2
--[NAME] ==> [NAME2]

C#代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Collections;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnection ConnectionNew = new SqlConnection("Data Source=leaf-home\\sqlserver2005;Initial Catalog=Test;Persist Security Info=True;User ID=sa;Password=?");
            SqlConnection ConnectionOld = new SqlConnection("Data Source=leaf-home\\sqlserver2005;Initial Catalog=Test;Persist Security Info=True;User ID=sa;Password=?");
            try
            {
                ConnectionNew.Open();
                ConnectionOld.Open();

                //1.在旧表中,用SqlDataReader读取出信息
                string SQL = "select * from Table_1";

                SqlCommand cmd = new SqlCommand(SQL, ConnectionOld);
                SqlDataReader sdr = cmd.ExecuteReader();

                //2.初始化SqlBulkCopy对象,用新的连接作为参数。
                SqlBulkCopy bulkCopy = new SqlBulkCopy(ConnectionNew);

                //3.写对应关系。如旧表的People列的数据,对应新表Human列,那么就写bulkCopy.ColumnMappings.Add("People","Human")
                //如果两张表的结构一样,那么对应关系就不用写了。
                //我是用哈希表存储对应关系的,哈希表作为参数到传入方法中,key的值用来存储旧表的字段名,VALUE的值用来存储新表的值
                Hashtable ht = new Hashtable();
                ht.Add("ID", "ID2");
                ht.Add("NAME", "NAME2");//

                foreach (string str in ht.Keys)
                {
                    bulkCopy.ColumnMappings.Add(str, ht[str].ToString());
                }

                //4.设置目标表名
                bulkCopy.DestinationTableName = "Table_2";

                //额外,可不写:设置一次性处理的行数。这个行数处理完后,会激发SqlRowsCopied()方法。默认为1
                bulkCopy.NotifyAfter = 1;

                //额外,可不写:设置激发的SqlRowsCopied()方法,这里为bulkCopy_SqlRowsCopied
                bulkCopy.SqlRowsCopied += new SqlRowsCopiedEventHandler(bulkCopy_SqlRowsCopied);

                //OK,开始传数据!
                bulkCopy.WriteToServer(sdr);
                Console.Write("传输完毕!");
                Console.Read();
            }
            catch (Exception ex)
            {
                Console.Write(ex.Message);
                Console.Read();
            }
            finally
            {
                ConnectionNew.Close();
                ConnectionOld.Close();
            }
        }

        //激发的方法写在外头
        private static void bulkCopy_SqlRowsCopied(object sender, SqlRowsCopiedEventArgs e)
        {
            //执行的内容。
            //这里有2个元素值得拿来用
            //e.RowsCopied,  //返回数值类型,表示当前已经复制的行数
            //e.Abort,       //用于赋值true or false,用于停止赋值的操作
            Console.WriteLine("当前已复制的行数:"+e.RowsCopied);
        }
    }
}

最终结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值