【发布时间】:2015-12-30 00:42:42
【问题描述】:
我的情况是,我在 2 个不同的数据库中有 [大部分] 匹配表。表模式通常是相同的,但有时会发生变化(列添加、重命名、删除)。在以下情况下,我需要将数据从 Source 复制到 Destination:
- 尝试将所有行从源插入到目标。没有更新。
- 唯一约束会导致重复插入失败 - 这没关系
- 如果源和目标之间的列不完全匹配,插入仍必须成功。是的,这是棘手的部分。无论列匹配,都需要根据匹配的模式插入。任何新建/删除/重命名的列都可以跳过和忽略,但整体插入必须成功。
- Source 可能是 Access 或 MSSQL,Dest 可能是 Access 或 MSSQL,因此任何 sql 都必须适用于两者。
- 这不是一次性的事情。它是软件/数据升级过程的一部分,对于许多客户来说,使用不同的数据集和不同的表会一遍又一遍地发生。但同样,大多数列将始终匹配(表名在两侧始终相同,具有相似的架构),偶尔会有列差异和唯一约束。
- 插入失败是正常的,因为违反了唯一约束(这意味着有重复的记录)。
- 由于列不匹配而导致插入失败是不行的——我需要找到一种方法使它们尽可能匹配。可以跳过/忽略不匹配的列。
- 不幸的是,表模式设计得不是很好,因此表没有 int 主键。许多表具有多列键,但不能使用这些键,因为可能需要将源中的任何表复制到目标中的任何表。所以依赖密钥是行不通的。
- 我正在使用 Visual Studio 2015 和最新的 c#。 SQL Server 和 Access。
这是一个奇怪的场景,但我需要一种强大的方法来处理它。我不在乎它是否是一个丑陋的黑客,它只需要工作。谁能想到一个好的方法?
【问题讨论】:
-
我将使用 ADO.NET 在 C# 中编写自己的逻辑,以复制源表和目标表中列的交集。其他要求也可以用同样的方式满足。你可以找出键是什么。也许您需要为某些匹配手动设置映射并将它们保存在 XML 中。这看起来很有趣。
-
为什么不使用 SSIS(SQlserver 集成服务)?然后在作业中使用它,以便您也可以安排它。它具有您在此处列出的所有功能。
-
我会为此使用 Access,以便能够使用 SQL 在 Access 和 MSSQL 之间传输数据。 链接源表和目标表,获取匹配列的列表,从中构建 INSERT 语句并运行它。非常简单。
标签: c# sql sql-server ms-access c#-4.0