在不更改访问数据库的情况下,将数据从MS Access数据库导入另一个数据库的最佳方法是什么?

时间:2010-11-02 09:24:50

标签: database ms-access odbc

我有一个关于访问数据库A的表(存储更多60.000条记录),我必须将其导入到另一个Access数据库B上的表中。

开始时,Access数据库B上的表存储来自Access数据库A的表中的3000条记录。

访问数据库A由另一个程序处理,如果我不必对其进行更改,我最好能够打开它并获取数据。我需要从访问数据库A上的表中导入更新记录和新记录以访问数据库B.

  • 每天数据库A都有100条新记录和一些更新记录,我需要在一天结束时将它们导入数据库B.我需要自动完成。

  • 新记录很容易找到,但更新记录怎么样?使用更新记录,我需要在数据库B中添加新行,而不是更改数据库B中的任何行。

有没有更好的方法来执行此操作,可能使用ODBC连接或其他?

请帮帮我! 谢谢和最好的问候。

3 个答案:

答案 0 :(得分:2)

Have a look at this microsoft web page

基本步骤是

  1. 确认两个表中的字段和数据类型是兼容的,例如字段中的数据可以转让;
  2. 从数据库A附加数据库B中的远程表;
  3. 运行追加查询以传输记录;
  4. 确认它有效,例如没有错误信息,正确的记录数量等。

答案 1 :(得分:0)

  1. 在数据库B中,右键单击>链接表格
  2. 选择您的数据库。
  3. 选择您感兴趣的表格。
  4. 您的数据库B现在“链接”到数据库A中的数据。现在您可以使用“联合”查询或任何您喜欢的查询将其与存储在数据库B表中的数据相结合。最重要的是,这不需要对数据库A进行任何更改。

答案 2 :(得分:0)

要更新现有记录,您需要比较两个记录,并在目标数据库中它们不相同时进行更新。

根据所涉及的字段数量,这可能很复杂。

这是我过去用于此目的的代码:

  Public Function UpdateTableData(ByVal strSourceTable As String, _
      ByVal strTargetTable As String, ByVal strJoinField As String, _
      ByRef db As DAO.Database, Optional ByVal strExcludeFieldsList As String, _
      Optional strAdditionalCriteria As String) As Boolean
    Dim strUpdate As String
    Dim rsFields As DAO.Recordset
    Dim fld As DAO.Field
    Dim strFieldName As String
    Dim strNZValue As String
    Dim strSet As String
    Dim strWhere As String

    strUpdate = "UPDATE " & strTargetTable & " INNER JOIN " & strSourceTable & " ON " & strTargetTable & "." & strJoinField & " = " & strSourceTable & "." & strJoinField
    ' if the fields don't have the same names in both tables,
    '   create a query that aliases the fields to have the names of the
    '   target table
    ' if the source table is in a different database and you don't
    '   want to create a linked table, create a query and specify
    '   the external database as the source of the table
    ' alternatively, for strTargetTable, supply a SQL string with
    '   the external connect string
    Set rsFields = db.OpenRecordset(strSourceTable)
    For Each fld In rsFields.Fields
      strFieldName = fld.Name
      If strFieldName <> strJoinField Or (InStr(", " & strExcludeFieldsList & ",", strFieldName & ",") <> 0) Then
         Select Case fld.Type
           Case dbText, dbMemo
             strNZValue = "''"
           Case Else
             strNZValue = "0"
         End Select
         strSet = " SET " & strTargetTable & "." & strFieldName & " = varZLSToNull(" & strSourceTable & "." & strFieldName & ")"
         strSet = strSet & ", " & strTargetTable & ".Updated = #" & Date & "#"
         strWhere = " WHERE Nz(" & strTargetTable & "." & strFieldName & ", " & strNZValue & ") <> Nz(" & strSourceTable & "." & strFieldName & ", " & strNZValue & ")"
         If db.TableDefs(strTargetTable).Fields(fld.Name).Required Then
            strWhere = strWhere & " AND " & strSourceTable & "." & strFieldName & " Is Not Null"
         End If
         If Len(strAdditionalCriteria) > 0 Then
            strWhere = strWhere & " AND " & strAdditionalCriteria
         End If
         Debug.Print strUpdate & strSet & strWhere
         Debug.Print SQLRun(strUpdate & strSet & strWhere, dbLocal) & " " & strFieldName & " updated."
      End If
    Next fld
    rsFields.Close
    Set rsFields = Nothing
    UpdateTableData = True
  End Function

您可以将此函数传递给两个表名或两个查询名。这允许很大的灵活性。它假定字段名称在传递的对象中都是相同的,如果它们不是同一个名称,您可以创建一个查询来对字段进行别名以匹配另一个表中的字段。

这是我用了数万次的代码变体。基本原则是它执行一系列UPDATE查询,这些查询在表中逐列进行,并根据哪些行具有不同的值进行更新。