如何使用DataSet将数据从一个数据库传输到另一个数据库?

时间:2008-10-24 16:08:48

标签: database ado.net merge data-transfer

像往常一样,首先是一些背景信息:

数据库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(或技术上的.txt文件)数据的DataTable。

  8. 使用更改更新数据库B的表。

  9. 我为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 Framework(我意识到这意味着我可以使用DataTables和TableAdapter而不是DataSet和DataAdapter,因为我只处理单个表,但无论如何)。

    TIA

2 个答案:

答案 0 :(得分:3)

暂时搁置我将使用SQLServer,并且只有一个包含多个视图的表,控制哪些人可以查看其中的哪些信息以避免整个同步问题......

我认为@Mitchel在这里是正确的。只需编写一个连接两个数据库的程序,分别加载一个表和一个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

答案 1 :(得分:0)

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

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