Каков наилучший способ импорта данных из базы данных MS Access в другую без изменения базы данных доступа? - PullRequest
1 голос
/ 02 ноября 2010

У меня есть таблица в базе данных доступа A (хранит более 60 000 записей), которую я должен импортировать в таблицу в другой базе данных Access B.

Вначале таблица в базе данных Access B хранит 3000 записей из таблицы в базе данных Access A.

База данных доступа A обрабатывается другой программой, и было бы лучше, если бы мне не пришлось вносить в нее изменения, я просто могу открыть ее и получить данные. Мне нужно импортировать обновленные записи и новые записи из таблицы в базе данных доступа A для доступа к базе данных B.

  • Каждый день в базе данных A есть более 100 новых записей и некоторые записи обновлений, мне нужно импортировать их в базу данных B в конце дня. Мне нужно сделать автоматически.

  • Новые записи легко найти, но как насчет обновления записей? При обновлении записи мне нужно добавить новую строку в базу данных B, а не изменять строки в базе данных B.

Есть ли лучший способ сделать это, возможно, используя соединение ODBC или что-то еще?

Пожалуйста, помогите мне! Спасибо и всего наилучшего.

Ответы [ 3 ]

2 голосов
/ 02 ноября 2010

Посмотрите на эту веб-страницу Microsoft

Основные шаги

  1. Убедитесь, что поля и типы данных в этих двух таблицах совместимы, например, данные в полях передаются;
  2. Присоединить удаленную таблицу в базе данных B из базы данных A;
  3. Запустить запрос на добавление для переноса записей;
  4. Подтвердите, что это сработало, например. нет сообщений об ошибках, правильное количество записей и т. д.
0 голосов
/ 03 ноября 2010

Чтобы обновить существующие записи, необходимо сравнить две записи и обновить их, если они не совпадают в целевой базе данных.

В зависимости от количества полей, это может быть сложно.

Вот код, который я использовал для этой цели в прошлом:

  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, которые проходят по таблице по столбцам и обновляются в зависимости от того, какие строки имеют разные значения.

0 голосов
/ 02 ноября 2010
  1. В базе данных B, Щелкните правой кнопкой мыши -> Связать таблицы .
  2. Выберите базу данных.
  3. Выберите интересующую вас таблицу (ы).

Ваша база данных B теперь «связана» с данными в базе данных A. Теперь вы можете использовать «объединенный» запрос или что угодно, чтобы объединить его с данными, хранящимися в вашей таблице базы данных B.Лучше всего, это не требует каких-либо изменений в базе данных A.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...