【问题标题】:How do I transfer data from one database to another using a DataSet?如何使用 DataSet 将数据从一个数据库传输到另一个数据库?
【发布时间】:2010-09-19 01:11:51
【问题描述】:

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

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

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

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

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

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

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

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

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

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

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

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

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


    【解决方案1】:

    为什么不简单地使用数据读取器,循环遍历记录,在需要时手动插入数据库 B?

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

    【讨论】:

    • 我考虑过这个,但我记得过去尝试过类似的事情,但它似乎慢得多。此外,某些记录可能会从数据库 A 中删除,因此需要在数据库 B 中删除它们。甚至不确定 Merge 是否也能处理。
    【解决方案2】:

    暂时搁置一下,我将使用 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
    

    【讨论】:

    • 该文件是因为两个数据库中的列名不同,所以我不确定 DataAdapter 会如何反应。使用该文件,我可以将数据强制放入具有匹配列名的 DataSet(通过使用 schema.ini 文件并在文本文件中写出列标题)。
    • 伪代码很好。看起来“手动”的方式并没有我想象的那么痛苦。谢谢 tvanfosson。
    猜你喜欢
    • 2012-04-19
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    相关资源
    最近更新 更多