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

标签 database ado.net merge data-transfer

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

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

数据库 B(Access 数据库)- 包含一个仅包含两列的表(反射(reflect)我们需要的表 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 来填充此数据表(与第 5 步,因为他们都使用不同的数据源)。

  7. 合并保存数据库 A 中数据的数据表(或技术上的 .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

最佳答案

暂时搁置一下,我会使用 SQLServer 并且只有一个表和多个 View 控制谁可以看到其中的哪些信息以避免整个同步问题...

我认为@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

关于database - 如何使用 DataSet 将数据从一个数据库传输到另一个数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/234177/

相关文章:

git - git reset --hard 和 git reset --merge 有什么区别

sql - 选择具体信息

数据库设计冗余功能依赖(FD)

mysql - 忘记添加主键

vb.net - 使用 DataContext 类和 SqlConnection 之间有什么区别?

unix - 如何从命令行合并两个CSV文件?

php - 过滤和合并两个二维数组之间的数据 - 结果不得显示在原始数组中多次出现的行

database - 如何在postgresql中创建触发器来检查函数是否退出

c# - 从 SQL Server Express 切换到 MySQL

c# - 'GridView1'的DataSourceID必须是IDataSource类型控件的ID