代码之家  ›  专栏  ›  技术社区  ›  Jason Down

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

  •  3
  • Jason Down  · 技术社区  · 16 年前

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

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

    数据库B(Access数据库)-保存一个只包含两列的表(从表a镜像到我们需要的内容)。应用程序的所有用户都可以访问数据库B。一个问题是,上的列名与数据库A中的表中的列名不同。

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

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

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

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

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

    5. 合并保存数据库A(或.txt文件,技术上)中数据的DataTable。

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

    我已经为DataAdapter手动编写了update、delete和insert命令,该命令可用于与数据库B对话。但是,由于DataSet-From-Database-B.Merge(DataSet From TxtFile[tableName])不翻转HasChanges标志,因此从未使用此逻辑。这意味着DataSet-From-Database-B.Update不会触发任何命令。

    我知道我总是可以从数据库B的表中删除所有记录,然后插入文本文件中的所有记录(即使我必须循环遍历数据集中的每个记录并应用row.SetAdded以确保它触发HasChanges标志),但我希望它每次只应用更改。

    短暂性脑缺血发作

    2 回复  |  直到 16 年前
        1
  •  3
  •   tvanfosson    16 年前

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

    我认为@Mitchel在这里是正确的。只需编写一个连接到两个数据库的程序,分别加载一个表和一个表。然后,对于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
    
        2
  •  0
  •   Mitchel Sellers    16 年前

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