【发布时间】:2010-09-19 01:11:51
【问题描述】:
像往常一样,先介绍一些背景信息:
数据库 A(Access 数据库)- 保存一个表,其中包含我只需要两列的信息。无法访问数据库 A 的人将使用应用程序需要这两列中的信息。
数据库 B(Access 数据库)- 保存一个只包含两列的表(反映我们需要的表 A 的内容)。数据库 B 可供应用程序的所有用户访问。一个问题是其中的列名与数据库 A 中的表中的列名不同。
我需要做的是通过一个会自动运行的实用程序传输必要的数据,比如每周一次(两个数据库不需要完全同步,只需关闭即可)。传输实用程序将从有权访问两个数据库的用户帐户运行(显然)。
这是我采取的方法(如果有更好的方法,请提出建议):
从数据库 A 中抓取数据。它只是必要表中的两列。
使用 DataReader 对象和 WriterStream 对象将数据写入 [tablename].txt 文件。我已经这样做了,因此我可以使用 schema.ini 文件并强制数据列具有与数据库 B 中相同的名称。
创建一个 DataSet 对象,其中包含一个镜像数据库 B 中的表的 DataTable。
使用 Microsoft.Jet.OLEDB.4.0 提供程序将 .txt 文件中的信息提取到 DataTable 中,该提供程序具有文本的扩展属性 hdr=yes 和 fmt=delimited(以匹配我拥有 schema.ini 的方式文件设置和 .txt 文件设置)。我正在使用 DataAdapter 来填充 DataTable。
创建另一个 DataSet 对象,其中包含一个镜像数据库 B 中的表的 DataTable。
从数据库 B 中获取信息,使其包含表中需要从数据库 A 更新的所有当前数据。我再次使用 DataAdapter 来填充此 DataTable(与第 5 步,因为它们都使用不同的数据源)。
合并包含数据库 A 中数据的 DataTable(或 .txt 文件,技术上)。
使用更改更新数据库 B 的表。
我已经为负责与数据库 B 对话的 DataAdapter 手动编写了更新、删除和插入命令。但是,这个逻辑从未使用过,因为 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
【问题讨论】:
标签: database ado.net merge data-transfer