【记录】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;
}
}
【记录】SqlBulkCopy 跨数据库,表自定义导入的更多相关文章
- java 跨数据库导入大数据
java 跨数据库导入大数据 /** * java程序跨服务器跨数据库批量导入导出百万级数据 * @param args * @throws Exception */ public static vo ...
- Sqlserver 2005 跨数据库 导入数据
--Sqlserver 2005 跨数据库 导入数据:--SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/O ...
- 记录-java(jxl) Excel导入数据库
本内容主要包括(文件上传.excel2003数据导入数据库)excel导入数据库功能需要jxl jar包支持 下面是文件上传的前端测试代码 <%@ page language="ja ...
- 20181112-PostgreSQL数据库dmp文件导入(记录一次数据导入)
20181112-PostgreSQL数据库dmp文件导入 标注:dmp文件导入,场景:多个schema导入 1. 环境准备: postgres集群master节点上,postgres用户执行以下操作 ...
- 孤荷凌寒自学python第四十七天通用跨数据库同一数据库中复制数据表函数
孤荷凌寒自学python第四十七天通用跨数据库同一数据库中复制数据表函数 (完整学习过程屏幕记录视频地址在文末) 今天继续建构自感觉用起来顺手些的自定义模块和类的代码. 今天打算完成的是通用的(至少目 ...
- SQL Server安全(7/11):使用跨数据库所有权链接(Cross-Database Ownership Chaining)的跨数据库安全
在保密你的服务器和数据,防备当前复杂的攻击,SQL Server有你需要的一切.但在你能有效使用这些安全功能前,你需要理解你面对的威胁和一些基本的安全概念.这篇文章提供了基础,因此你可以对SQL Se ...
- MyBatis 强大之处 多环境 多数据源 ResultMap 的设计思想是 缓存算法 跨数据库 spring boot rest api mybaits limit 传参
总结: 1.mybaits配置工2方面: i行为配置,如数据源的实现是否利用池pool的概念(POOLED – This implementation of DataSource pools JDBC ...
- SQL SERVER SP命令及实现跨数据库查询
1.数据库: (1)sp_helpdb:报告有关指定数据库或所有数据库的信息. 例:sp_helpdb --显示所有数据库信息(名称.大小等) 例:sp_helpdb Recruitment ...
- [跨数据库、微服务] FreeSql 分布式事务 TCC/Saga 编排重要性
前言 FreeSql 支持 MySql/SqlServer/PostgreSQL/Oracle/Sqlite/Firebird/达梦/Gbase/神通/人大金仓/翰高/Clickhouse/MsAcc ...
随机推荐
- java分享第二十天(build.xml的语法及写法)
通常情况下,Ant构建文件build.xml应该在项目的基础目录.可以自由使用其他文件名或将构建文件中其他位置.在本练习中,创建一个名为build.xml 在电脑的任何地方的文件. <?xml ...
- dp入门--poj 1163数塔
...
- 实验mongodb使用gridfs存放一个大文件
1.启动mongoDB 2.使用gridfs存放大文件 3.观察fs.chunks和fs.files的情况 命令 db.fs.chunks.find()查到的是一些二进制文件:
- Red Hat5下源码安装mysql5.6过程记录
1.安装cmake包 [root@edu soft]# tar -xzf cmake-.tar.Z [root@edu soft]# cd cmake- [root@edu cmake-]# ./co ...
- TP5与TP3.X对比
首先声明本章节并非是指导升级旧的项目到5.0,而是为了使用3.X版本的开发者更快的熟悉并上手这个全新的版本.同时也强烈建议开发者抛弃之前旧的思维模式,因为5.0是一个全新的颠覆重构版本. 需要摒弃的3 ...
- ★★★Oracle sql 传参特别注意★★★
最近遇到一个非常烦人的问题,用传参的方式执行sql语句结果老是报 Oracle ORA-01722: 无效数字 一直无法找到原因. 表结构大致如下: table test_station ( tblR ...
- dom初识
1什么是dom document object model文档对象模型 是将整个页面文档封装成了一个对象,就是一个文档对象 整个页面就是一个文档,是由很多的节点组成的节点又包括三部分: 元素 属性 文 ...
- matlab 中 eps 的分析
eps(a)是|a|与大于|a|的最小的浮点数之间的距离,距离越小表示精度越高.默认a=1: 这里直接在matlab中输入:eps == eps(1)(true). 我们知道浮点数其实是离散的,有限的 ...
- Lesson 7 Too late
Text The plane was late and detectives were waiting at the airport all morning. They were expecting ...
- Python黑帽编程1.1虚拟机安装和配置 Kali Linux 2016
Python黑帽编程1.1虚拟机安装和配置 Kali Linux 2016 0.1 本系列教程说明 本系列教程,采用的大纲母本为<Understanding Network Hacks Att ...