Добавить данные из существующего MDB в другой существующий MDB - PullRequest
2 голосов
/ 12 апреля 2011

Я модернизирую существующий внешний и внутренний набор mdbs.Бэк-энд становится раздутым и влияет на производительность.Данные более двух лет все еще должны быть сохранены, но вряд ли когда-либо снова будут доступны.Я считаю, что было бы целесообразно иметь активную внутреннюю часть (т. Е. Данные только за текущий и предыдущий год) и заархивированную внутреннюю часть (т. Е. В начале каждого года добавлять все данные из активнойконец в существующий, заархивированный конец).

  • Какие еще подходы я должен рассмотреть?
  • Если это подходящий подход, как мне добавить все данные из активной внутренней базы данных в базу данных архива, предпочтительно из внешнего интерфейса (например, функции запуска)?
    • Единственный способ, который мне удалось идентифицировать, - это зайти в бэкэнд архива, импортировать каждую таблицу из активного бэкэнда и затем добавить.Есть ли способ сделать все это из внешнего интерфейса?

1 Ответ

2 голосов
/ 12 апреля 2011

Вы упомянули вздутие живота.Запустите Compact и Repair на раздутом внутреннем MDB, если вы этого еще не сделали.Помимо уменьшения размера файла, он также обновляет статистику индекса, что позволяет оптимизатору запросов принимать более правильные решения относительно ваших планов запросов.

Вы не предоставили подробную информацию о существующих базах данных и таблицах, поэтому я сделал несколько упрощающих предположений.

  1. Ваш внешний MDB содержит ссылки на все таблицы в концеКонец MDB, который вы хотите заархивировать.
  2. Все внешние ссылки являются ссылками только на эти таблицы.(IOW, нет ссылок на таблицы, которые вы не хотите архивировать.
  3. Имена ссылок совпадают с именами таблиц во внутренней базе данных.
  4. Все ваши таблицы содержат поле даты с именем"date_field". (Это поле, значения которого будут использоваться для определения того, какие записи архивируются.)
  5. Вы создали архивную базу данных C: \ db \ archive.mdb, которая включает в себя пустые копии всехтаблицы, которые вы хотите заархивировать. Возможно, вы захотите преобразовать поля автонумерации в длинное целое число. Также, если вы не предполагаете, что заархивированные данные вряд ли когда-либо будут использованы, вы можете отбросить все индексы (включая первичные ключи, уникальные ограничения иотношения) ... может быть, если вы заботитесь, может быть сэкономлено много места ... но вставка данных может быть намного быстрее, если у вас нет индексов для обновления.

Поэтому я предлагаю сделатькопию вашей внутренней базы данных, а затем попробуйте эту процедуру. Посмотрите в немедленном окне, чтобы проверить операторы INSERT и DELETE.sonable раскомментируйте две строки CurrentDb.Execute и посмотрите, что произойдет.(Вы делали резервную копию сначала, верно?)

Public Sub DoArchive()
    Const cstrArchive As String = "C:\db\archive.mdb"
    Dim db As DAO.Database
    Dim tdf As DAO.TableDef
    Dim strAppend As String
    Dim strCutoff As String
    Dim strDelete As String
    Dim strWhere As String
    Dim strMsg As String

On Error GoTo ErrorHandler

    Set db = CurrentDb
    strCutoff = "#" & Year(Date) - 1 & "/01/01#"
    strWhere = " WHERE date_field < " & strCutoff
    For Each tdf In db.TableDefs
        If Len(tdf.Connect) > 0 Then
            strAppend = "INSERT INTO [" & tdf.name & "] IN '" & _
                cstrArchive & "' SELECT * FROM [" & tdf.name & _
                "]" & strWhere & ";"
            Debug.Print strAppend
            ''CurrentDb.Execute strAppend, dbFailOnError
            strDelete = "DELETE FROM [" & tdf.name & "]" & _
                strWhere & ";"
            Debug.Print strDelete
            ''CurrentDb.Execute strDelete, dbFailOnError
        End If
    Next tdf

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

ErrorHandler:
    strMsg = "Error " & Err.Number & " (" & Err.description _
        & ") in procedure DoArchive"
    MsgBox strMsg
    GoTo ExitHere
End Sub
...