【问题标题】:How to merge data from two separate access 2007 databases如何合并来自两个单独的 access 2007 数据库的数据
【发布时间】:2011-02-09 20:57:39
【问题描述】:

我有两个结构相同的数据库,a 计算机中的数据库 a 和计算机 b 中的数据库 b。

数据库a****(a.accdb)****和数据库b****(b.accdb)****的数据不同。然后在数据库 a 中我有例如 ID:1、2、3,在数据库 B 中我有 ID:4、5、6

然后我需要将这些数据库数据合并到一个数据库中(a 或 b,没关系),所以最终的数据库看起来像。 ID:1,2,3,4,5,6

我搜索了一个简单的方法来做到这一点。因为我有很多桌子。而通过联合查询来做到这一点实在是太乏味了。

我搜索了一个仅用于没有方案的数据的备份选项,如 postgreSQl 或许多其他 RDBMS,但我在 access 2007 中看不到此选项。

pd:只有表可能有重复值(我猜 pk 不允许复制重复值,所有其他值都会被很好地复制)。如果我错了,请纠正我。

感谢您的帮助。

【问题讨论】:

  • 没有自动数字。主键由 ID 文本字段(不是自动数字)和日期字段组成。几乎所有的表都有来自 pk 的组合。 -> 另一方面,我有一个客户表。客户的主键是他的识别号。那么可能在数据库 a 中有一个客户端,在数据库 b 中有相同的客户端。但是几乎所有的表都不存在这个问题,并且每个数据库中的寄存器都不同-----------那么如果在这个单个表中没有复制数据就没有问题。对于这个单表,我可以手动复制和粘贴值。

标签: database ms-access import export ms-access-2007


【解决方案1】:

如果您有一个表 tblFoo,在两个数据库中具有相同的结构,您可以尝试将一个表的内容附加到另一个表中。所以打开 a.accdb:

INSERT INTO tblFoo
SELECT *
FROM tblFoo IN 'C:\YourPath\b.accdb';

实际上,我怀疑这种方法是否适合您,因为您提到了主键和重复项。将 tblFoo 的两个副本中的内容附加到第三个表 tblFooMaster 中可能会更好,该表没有任何主键或唯一约束。在这种情况下,您必须弄清楚要如何处理 tblFooMaster 中的重复项。

我希望您在尝试任何形式的整合之前备份这两个数据库。

编辑:如果该方法令人满意,则无需为每个表创建查询。使用 VBA 为您构建和执行查询。

Public Sub ImportTableData(ByVal pstrTable As String, _
        ByVal pstrDb As String)

    Dim strSql As String
    strSql = "INSERT INTO " & pstrTable & vbNewLine & _
        "SELECT *" & vbNewLine & _
        "FROM " & pstrTable & " IN '" & pstrDb & "';"
    'caller will handle errors '
    CurrentDb.Execute strSql, dbFailOnError
End Sub

由于您的偏好是将表传输作为单个操作进行,您可以让另一个 VBA 过程将您的表名称提供给 ImportTableData 过程。

Public Sub ImportAllTables()
    Const cstrDb As String = "C:\YourPath\b.accdb"
    Dim tdf As TableDef
    Dim strMsg As String

On Error GoTo ErrorHandler

    For Each tdf In CurrentDb.TableDefs
        'ignore system and temporary tables '
        If Not (tdf.Name Like "MSys*" Or _
                tdf.Name Like "~*") Then
            Call ImportTableData(tdf.Name, cstrDb)
        End If
    Next tdf

ExitHere:
    On Error GoTo 0
    Set tdf = Nothing
    Exit Sub

ErrorHandler:
    Select Case Err.Number
    Case 3078
        strMsg = "Input table " & tdf.Name & " not found."
        MsgBox strMsg
        Resume Next
    Case Else
        strMsg = "Error " & Err.Number & " (" & Err.Description _
            & ") in procedure ImportAllTables"
        MsgBox strMsg
        GoTo ExitHere
    End Select
End Sub

【讨论】:

  • 那行得通,只是我认为存在一种更简单的方法,就像在其他数据库中一样,只导出所有数据库数据或类似的东西。------ 现在我必须处理我所有的查询。我再次回答你。如何以一种方法执行所有 35 个查询???不仅每次查询一个。非常感谢
  • 非常感谢,正是我需要的。 :) 最后一个问题,有没有办法从 C#.NET 调用这个 vba?或者我需要我自己的 c# 方法?
  • @Diego 也许会问另一个关于如何使用 C# 在 Access 数据库中运行 VBA 过程的问题。我无法帮助你,但我怀疑其他人以前也曾走这条路。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
  • 2018-09-20
  • 1970-01-01
  • 2013-07-30
  • 1970-01-01
相关资源
最近更新 更多