像往常一样,先介绍一些背景信息:
数据库 A(Access 数据库)- 保存一个表,其中包含我只需要两列的信息。无法访问数据库 A 的人将使用应用程序需要这两列中的信息。
数据库 B(Access 数据库)- 保存一个只包含两列的表(反映我们需要从表 A 中获取的内容)。数据库 B 可供应用程序的所有用户访问。一个问题是,其中一个列名与数据库 A 中的表中的不同。
我需要做的是通过一个会自动运行的实用程序传输必要的数据,比如每周一次(两个数据库不需要完全同步,只需关闭即可)。传输实用程序将从有权访问两个数据库的用户帐户运行(显然)。
这是我采取的方法(如果有更好的方法,请提出建议):
从数据库 A 中获取数据。它只是必要表中的两列。
使用 DataReader 对象和 WriterStream 对象将数据写入 [tablename].txt 文件。我已经这样做了,所以我可以使用 schema.ini 文件并强制数据列具有与数据库 B 中相同的名称。
创建一个 DataSet 对象,其中包含一个镜像数据库 B 中的表的 DataTable。
使用具有文本扩展属性 hdr=yes 和 fmt=delimited 的 Microsoft.Jet.OLEDB.4.0 提供程序将 .txt 文件中的信息吸入 DataTable(以匹配我的 schema.ini 文件设置和 .txt文件设置)。我正在使用 DataAdapter 来填充 DataTable。
创建另一个 DataSet 对象,其中包含一个镜像数据库 B 中的表的 DataTable。
从数据库 B 中获取信息,使其包含表中需要从数据库 A 更新的所有当前数据。我再次使用 DataAdapter 填充此 DataTable(与步骤 5 不同,因为它们是两者都使用不同的数据源)。
合并包含来自数据库 A(或 .txt 文件,技术上)数据的 DataTable。
使用更改更新数据库 B 的表。
我已经为 DataAdapter 手动编写了更新、删除和插入命令,该命令负责与数据库 B 通信。但是,这个逻辑从未使用过,因为 DataSet-From-Database-B.Merge(Dataset-From-TxtFile[tableName] ) 不会翻转 HasChanges 标志。这意味着 DataSet-From-Database-B.Update 不会触发任何命令。
那么有什么方法可以使用我正在使用的方法从 DataSet-From-TxtFile 获取数据以合并并应用于数据库 B?我在这里错过了关键的一步吗?
我知道我总是可以从数据库 B 的表中删除所有记录,然后只插入文本文件中的所有记录(即使我必须遍历 DataSet 中的每条记录并应用 row.SetAdded 以确保它触发 HasChanges 标志) ,但我宁愿让它每次只应用更改。
我正在使用 c# 和 2.0 框架(我意识到这意味着我可以使用 DataTables 和 TableAdapters 而不是 DataSets 和 DataAdapters,因为我只处理一个表,但无论如何)。
TIA