【问题标题】:How do I compare 2 similar tables in 2 different MS Access databases in C#?如何在 C# 中比较 2 个不同 MS Access 数据库中的 2 个相似表?
【发布时间】:2010-09-08 17:04:03
【问题描述】:

我被要求创建一个桌面工具来比较旧的访问数据库和新的“更新”访问数据库,并创建一个包含所有新记录或更改记录的 excel 文件。

我需要比较的数据库表是结构化的
主键 |说明。

我创建了一个简单的 Windows 表单,允许用户选择旧数据库和新数据库,我想出了如何打开数据库并对它们运行 SQL 查询,但是我被困在如何在不创建数千个 SQL 的情况下进行比较调用每个数据库。

使用 SQL 服务器和 Web 服务器,我现在已经完成了,但是将其创建为桌面应用程序和 MS Access 让我有点困惑。

【问题讨论】:

  • 您需要能够为用户提供一种进行比较的方法,还是只需要生成一个带有比较的excel文件?
  • 每个数据库目前持有 3500-5000 条记录,但会增长。我只需要生成一个包含新记录或更改记录的文件。
  • 您可以建立一个与一个数据库的连接并在 IN 中创建一个与第二个数据库的内联连接:stackoverflow.com/questions/3123359/…
  • 我喜欢这个答案我可能会重写它以简化。我不知道“IN”谢谢

标签: c# sql ms-access


【解决方案1】:

这在 Access 中与在 SQL Server 中完全相同。只需编写一个为您进行比较的查询:

select t1.key, t1.description, t2.description
 from t1
   full outer join t2 on t1.key=t2.key
 where t1.description <> t2.description
    or t1.description is null
    or t2.description is null;

这将生成具有相同键但值不同的所有记录的列表。然后只需将记录集转储到文件或网格视图或其他东西。

您也可以在纯 MS Access 中为此创建 UI,并完全跳过 C# 部分。那么它会非常快,而且 MS Access 非常适合构建原生 UI。

【讨论】:

  • MS Access 不支持完全外连接。
  • 也就是说,Jet/ACE 不支持 JOIN 上的 OUTER 关键字。只有 INNER(默认)和 LEFT/RIGHT。我猜你需要两个 LEFT JOIN 的 UNION。
【解决方案2】:

如果您使用的是 .Net Framework 3.5 或更高版本,一种方法是创建两个列表并将两个数据库中的记录放在这两个列表中进行比较。之后,您可以使用Linq ExceptUnion 扩展方法来快速找到两组的差异。这些扩展方法见here

【讨论】:

    【解决方案3】:

    您是否坚持用户选择的技术?如果只有一个较旧的数据库和一个较新的数据库进行比较,则不需要桌面应用程序。如果有多个较旧和较新的,您将需要它。

    如果有帮助,您可以将 Access dbs 导入 SQL Server。

    还可以考虑创建第三个 Access 数据库,其中包含指向前两个表的链接。然后您将两个数据集放在一个位置,您可以编写查询来比较它们。

    无论将它们放入内存还是 SQL Server 中,想法都是一样的,只是在后端比在代码中更容易跟踪查询。

    【讨论】:

    • 这个任务每月发生多次,我无法改变技术。再加上一个桌面应用程序,我可以在这个方向上做一些学习。 :)
    【解决方案4】:

    这就是我最终的做法。

    我以简单的形式从用户那里收到了新旧数据库文件信息。然后我打开 Olddatabase 并使用来自Ahmad Mageed's answer 的代码将每条记录添加到字典“dictionaryOld”中。然后我创建了第二个字典“dictionaryNew”来保存新的或更改的记录。我遍历新数据库并将每条记录与 dictionaryOld 进行比较,添加不存在或已更改的记录。

    我确信有更好的方法可以做到这一点,但它看起来可以满足我的需要,谢谢大家为我指明方向!

    现在开始研究如何将其写入文件并捕获错误等...

    这里是代码

        Removed source, new and improved version comming....
    

    【讨论】:

    • 为什么不只选择新的或更改的记录?例如:SELECT * FROM t1 LEFT JOIN [MS Access;PWD=databasePWD;DATABASE=C:\docs\db.mdb].t2 ON t1.ID=t2.ID WHERE t2.ID Is Null
    • 我正在重写以做到这一点。
    • 我对此有点复杂...我无法执行 sql 语句。我目前最终得到以下结果
    • "SELECT ID,Col2 FROM TableOLD LEFT JOIN [MS Access;DATABASE=c:\\dbNEW.mdb].t2 ON TableOLD.ID=TableNEW.ID WHERE TableNEW.ID Is Null" 我得到当我执行阅读器时,此语句出现语法错误
    • 这里是简化的 SQL 字符串 sqlCompare = "SELECT "+col1+","+col2+" FROM "+t1+" LEFT JOIN [MS Access;DATABASE="+db2+"].t2 ON "+ t1+"."+col1+"="+t2+"."+col1+" WHERE "+t2+"."+col1+" 为空";
    猜你喜欢
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多