【记录】SqlBulkCopy 跨数据库,表自定义导入
使用场景:
一个数据库中的表数据,导入到另一个数据库中的表中,这两个表的表结构不一样,如果表结构一样的时候,导入非常简单,直接读取导入就行了,表结构不一样,就意味着需要加入一些判断,SqlBulkCopy 提供了 ColumnMappings,但这只是列名的映射,而不像 AutoMapper 那样可以自定义映射转换,那如何判断导入呢?答案就是在导入之前对原数据集进行验证,得到和目标表一致的表数据,我们可以使用 case when 进行判断。比如 table1 中有两列:State1 和 State2,对应 table1 中的 State,值对应关系为:
- State1 0 && State2 0 对应 State 0
- State1 1 && State2 0 对应 State 1
- State1 0 && State2 1 对应 State 2
- State1 1 && State2 1 对应 State 3
代码示例:
/// <summary>
/// 数据库中的表复制到另一个数据库中的表
/// </summary>
private static void SqlBulkCopyMethod()
{
TimeSpan ts1 = new TimeSpan(DateTime.Now.Ticks);
try
{
SqlConnection connetionPub = new SqlConnection("Server=.; Database=DB1; User ID=sa;Password=sa; MultipleActiveResultSets=True;");
using (connetionPub)
{
SqlCommand commandPub = connetionPub.CreateCommand();
using (commandPub)
{
commandPub.CommandText = @"select
*,
(case when (State1 = 0 and State2=0)
then 0
when (State1 = 0 and State2=1)
then 1
when (State1 = 1 and State2=0)
then 2
when (State1 = 1 and State2=1)
then 3
else 4 end
) State
from table1";
commandPub.CommandType = System.Data.CommandType.Text;
connetionPub.Open();
SqlConnection connectionBulkCopy = new SqlConnection("Server=.; Database=DB2; User ID=sa;Password=sa; MultipleActiveResultSets=True;");
using (connectionBulkCopy)
{
connectionBulkCopy.Open();
SqlDataReader dataReader = commandPub.ExecuteReader();
SqlBulkCopy bulkCopy = new SqlBulkCopy(connectionBulkCopy);
using (bulkCopy)
{
bulkCopy.BatchSize = 1000;
bulkCopy.ColumnMappings.Add("id", "ID");
bulkCopy.ColumnMappings.Add("name", "Name");
bulkCopy.ColumnMappings.Add("State", "State");
bulkCopy.DestinationTableName = "table2";
bulkCopy.WriteToServer(dataReader);
}
}
}
}
TimeSpan ts2 = new TimeSpan(DateTime.Now.Ticks);
TimeSpan ts3 = ts1.Subtract(ts2).Duration();
Console.WriteLine(string.Format("执行时间:{0}秒", ts3.TotalSeconds.ToString()));
Console.ReadKey();
}
catch (Exception ex)
{
throw ex;
}
}
作者:田园里的蟋蟀
微信公众号:你好架构
出处:http://www.cnblogs.com/xishuai/
公众号会不定时的分享有关架构的方方面面,包含并不局限于:Microservices(微服务)、Service Mesh(服务网格)、DDD/TDD、Spring Cloud、Dubbo、Service Fabric、Linkerd、Envoy、Istio、Conduit、Kubernetes、Docker、MacOS/Linux、Java、.NET Core/ASP.NET Core、Redis、RabbitMQ、MongoDB、GitLab、CI/CD(持续集成/持续部署)、DevOps等等。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
微信公众号:你好架构
出处:http://www.cnblogs.com/xishuai/
公众号会不定时的分享有关架构的方方面面,包含并不局限于:Microservices(微服务)、Service Mesh(服务网格)、DDD/TDD、Spring Cloud、Dubbo、Service Fabric、Linkerd、Envoy、Istio、Conduit、Kubernetes、Docker、MacOS/Linux、Java、.NET Core/ASP.NET Core、Redis、RabbitMQ、MongoDB、GitLab、CI/CD(持续集成/持续部署)、DevOps等等。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。