3

像往常一样,先介绍一些背景信息:

数据库 A(Access 数据库)- 保存一个表,其中包含我只需要两列的信息。无法访问数据库 A 的人将使用应用程序需要这两列中的信息。

数据库 B(Access 数据库)- 保存一个只包含两列的表(反映我们需要从表 A 中获取的内容)。数据库 B 可供应用程序的所有用户访问。一个问题是,其中一个列名与数据库 A 中的表中的不同。

我需要做的是通过一个会自动运行的实用程序传输必要的数据,比如每周一次(两个数据库不需要完全同步,只需关闭即可)。传输实用程序将从有权访问两个数据库的用户帐户运行(显然)。

这是我采取的方法(如果有更好的方法,请提出建议):

  1. 从数据库 A 中获取数据。它只是必要表中的两列。

  2. 使用 DataReader 对象和 WriterStream 对象将数据写入 [tablename].txt 文件。我已经这样做了,所以我可以使用 schema.ini 文件并强制数据列具有与数据库 B 中相同的名称。

  3. 创建一个 DataSet 对象,其中包含一个镜像数据库 B 中的表的 DataTable。

  4. 使用具有文本扩展属性 hdr=yes 和 fmt=delimited 的 Microsoft.Jet.OLEDB.4.0 提供程序将 .txt 文件中的信息吸入 DataTable(以匹配我的 schema.ini 文件设置和 .txt文件设置)。我正在使用 DataAdapter 来填充 DataTable。

  5. 创建另一个 DataSet 对象,其中包含一个镜像数据库 B 中的表的 DataTable。

  6. 从数据库 B 中获取信息,使其包含表中需要从数据库 A 更新的所有当前数据。我再次使用 DataAdapter 填充此 DataTable(与步骤 5 不同,因为它们是两者都使用不同的数据源)。

  7. 合并包含来自数据库 A(或 .txt 文件,技术上)数据的 DataTable。

  8. 使用更改更新数据库 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

4

2 回答 2

3

暂时搁置一下,我将使用 SQLServer,并且只有一个带有多个视图的表来控制谁可以看到其中的信息以避免整个同步问题......

我认为@Mitchel 在这里是正确的。只需编写一个连接两个数据库的程序,分别加载A表和B表。然后,对于 A 中的每个元素(列对),确保它在 B 中。如果不是,则将其插入 B。然后,对于 B 中的每个元素,确保它在 A 中。如果不是,则将其从 B 中删除. 保存 B. 我不认为需要先转到文件。

伪代码:

DataTable A = load table from A
DataTable B = load table from B

foreach row in A
   col1 = row[col1]
   col2 = row[col2]
   matchRow = B.select( "col1 = " + col1 + " and col2 = " + col2)
   if not matchRow exists
      add new row to B with col1,col2
   end
end

foreach row in B
   col1 = row[col1]
   col2 = row[col2]
   matchRow = A.select( "col1 = " + col1 + " and col2 = " + col2)
   if not matchRow exists
      remove row from B
   end
end

update B
于 2008-10-24T17:06:36.393 回答
0

为什么不简单地使用数据阅读器,并遍历记录,如果需要手动插入数据库 B?

而不是使用数据集、合并等。

于 2008-10-24T16:11:51.590 回答