参考文章: 点击打开链接
上面的文章有用, 但不太清晰, 重新做了个比较清晰的。
假设要将一个库中的 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);
}
}
}
最终结果: