C# 如何比较C中两个不同MS Access数据库中的两个类似表?

C# 如何比较C中两个不同MS Access数据库中的两个类似表?,c#,sql,ms-access,C#,Sql,Ms Access,我被要求创建一个桌面工具来比较旧的access DB和更新的access DB,并创建一个包含所有新记录或更改记录的excel文件 我需要比较的数据库表是结构化的 主键|说明 我创建了一个简单的Windows窗体,允许用户选择旧的和新的数据库,我知道了如何打开数据库并对它们运行SQL查询,但是我一直在研究如何在不向每个数据库进行数千次SQL调用的情况下进行比较 有了SQL server和Web服务器,我现在就可以完成了,但将其创建为桌面应用程序和MS Access让我有点困惑。您是否被用户选择的

我被要求创建一个桌面工具来比较旧的access DB和更新的access DB,并创建一个包含所有新记录或更改记录的excel文件

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

我创建了一个简单的Windows窗体,允许用户选择旧的和新的数据库,我知道了如何打开数据库并对它们运行SQL查询,但是我一直在研究如何在不向每个数据库进行数千次SQL调用的情况下进行比较


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

您是否被用户选择的技术所困扰?如果只有一个较旧的db和一个较新的db进行比较,则不需要桌面应用程序。如果有多个旧的和新的,您将需要它

如果有帮助,您可以将Access数据库导入SQL Server

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


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

如果您使用的是.Net Framework 3.5或更高版本,一种方法是创建两个列表,并将两个数据库中的记录放在这两个列表中进行比较。之后,可以使用Linq Except和Union扩展方法快速查找两个集合中的差异。有关这些扩展方法,请参阅。

这在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;
这将生成具有相同键但值不同的所有记录的列表。然后将记录集转储到文件或gridview或其他文件中


您还可以在纯MS Access中为此创建UI,并完全跳过C部分。这样做会非常快,MS Access对于构建本机UI非常好。

以下是我最终如何完成这项工作的

我以一种简单的形式从用户那里接收新旧数据库文件信息。然后我打开旧数据库,并使用源代码将每条记录添加到字典中。然后,我创建了第二个Dictionary new来保存新的或更改的记录。我迭代了新数据库,并将每条记录与DictionaryLD进行比较,添加不存在或已更改的记录

我相信有很多更好的方法可以做到这一点,但它看起来适合我需要的东西。谢谢你们为我指明了方向

现在,我们要弄清楚如何将这些内容写入文件并捕获错误等

这是密码

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

您需要为用户提供一种进行比较的方法,还是只需要生成一个excel文件,其中包含一次比较?每个数据库目前保存着3500-5000条记录,但会不断增长。我只需要生成一个包含新记录或更改记录的文件。您可以设置一个与一个数据库的连接,然后在中创建与第二个数据库的联机连接:我喜欢答案我可以重写此文件以简化。我不知道在《谢谢》中,这个任务一个月会发生多次,我无法改变技术。加上一个桌面应用程序,我可以在这方面做一些学习:为什么不选择新的或更改的记录?例如:选择*从t1左连接[MS Access;PWD=databasePWD;DATABASE=C:\docs\db.mdb].t2在t1.ID=t2.ID,其中t2.ID为空我正在重写当前的操作。我已经克服了这个复杂的问题。。。我无法执行sql语句。当前,我得到了以下SELECT ID,Col2 FROM TableOLD LEFT JOIN[MS Access;DATABASE=c:\\dbNEW.mdb].t2 ON TableOLD.ID=TableNEW.ID其中TableNEW.ID为Null我在执行读卡器时在这条语句上出现语法错误这里是简化的SQL字符串sqlCompare=SELECT+col1+,+Col2+FROM+t1+LEFT JOIN[MS Access;DATABASE=+db2+].t2在+t1+.+col1+=+t2+.+col1+上,其中+t2+.+col1+为空;MS Access不支持完全外部联接。也就是说,Jet/ACE不支持联接上的外部关键字。只有内部默认值和左/右。我想你需要两个左连接的并集。