Дереплицировать базу данных Access

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

Я только что попытался открыть его с помощью Outlook 2013, но получаю сообщение об ошибке, что в базе данных включена репликация, и она создана с более ранней версией Access (что-то в этом роде).

Я предполагаю, что проблема только в репликации. Есть ли способ удалить репликацию, чтобы я мог использовать ее в Access 2013?


person Sean    schedule 10.11.2013    source источник


Ответы (1)


Так что это непростая задача - нереплицировать базу данных.

Сначала я нашел сценарий VBA WV Mitchell, который копирует ваши таблицы в новую базу данных: http://www.wvmitchell.com/tips/Removing%20Access%20Replication.htm

Это не копирует первичные ключи или отношения, поэтому я написал несколько быстрых и грязных сценариев VBA, чтобы помочь с этим.

Шаг 1: В функцию MakeOneTable из приведенного выше скрипта я добавил это (над строкой db.Close):

Dim td As TableDef
Dim idxLoop As Index

Set td = db.TableDefs(TableName)
For Each idxLoop In td.Indexes
    If idxLoop.Primary = True Then

        Dim colnames As String
        colnames = idxLoop.Fields
        colnames = Replace(colnames, ";+", "],[")
        colnames = Replace(colnames, "+", "[")
        colnames = colnames & "]"
        Debug.Print "DoCmd.RunSQL ""CREATE INDEX [PrimaryKey] ON [" & TableName & "] (" & colnames & ") With Primary;"""

        Exit For
    End If
Next idxLoop

Это выведет в окно Debug (Immediate) некоторый код VBA для создания первичных ключей (а также для создания новой базы данных и экспорта данных в нее - код MV Mitchell). Скопируйте этот код VBA, поместите его в модуль/макрос в новой базе данных и запустите его, и он должен создать первичные ключи.

Шаг 2: В старой (реплицированной) базе данных запустите этот код VBA, который сгенерирует еще один код VBA для создания отношений:

Sub GenerateRelationshipCode()
    Dim db As DAO.Database
    Set db = CurrentDb()
    Dim rs As DAO.Recordset

    Set rs = db.OpenRecordset("SELECT DISTINCT szRelationship,szObject,szReferencedObject FROM MSysRelationships ORDER BY szObject,szReferencedObject")
    rs.MoveFirst

    Do While Not rs.EOF

        Dim rsFields As DAO.Recordset
        Set rsFields = db.OpenRecordset("SELECT * FROM MSysRelationships WHERE szRelationship = '" & Replace(rs.Fields(0), "'", "''") & "'")

        Dim PKFields As String, PKTable As String, FKFields As String, FKTable As String
        PKFields = "": PKTable = "": FKFields = "": FKTable = ""

        Do While Not rsFields.EOF
            PKFields = PKFields & rsFields("szReferencedColumn") & ","
            PKTable = rsFields("szReferencedObject")
            FKFields = FKFields & rsFields("szColumn") & ","
            FKTable = rsFields("szObject")
            rsFields.MoveNext
        Loop

        PKFields = Left(PKFields, Len(PKFields) - 1)
        FKFields = Left(FKFields, Len(FKFields) - 1)

        Debug.Print "Call AddRelationship(""" & rs.Fields(0) & """, """ & FKTable & """, """ & FKFields & """, """ & PKTable & """, """ & PKFields & """)"
        rs.MoveNext
    Loop

    Set db = Nothing
End Sub

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

Public Sub AddRelationship(Name As String, FKTable As String, FKFields As String, PKTable As String, PKFields As String)
    Dim strSQL As String
    Dim db As DAO.Database
    Set db = CurrentDb()
    Name = "FK_" & Replace(FKTable, " ", "") & "_" & Replace(PKTable, " ", "") 'only enable this line if there aren't multiple relationships between same 2 tables
    strSQL = "ALTER TABLE [" & FKTable & "] " & _
    "  add constraint " & Name & " foreign key (" & FKFields & ") " & _
    "   references [" & PKTable & "](" & PKFields & ") "
    db.Execute strSQL, dbFailOnError
    Set db = Nothing
End Sub

Запустите сгенерированный код VBA в модуле с указанной выше функцией, и он должен перестроить ваши отношения в новой базе данных.

Обратите внимание, что этот код быстрый и грязный, поэтому может потребоваться исправление некоторых ошибок для вашей базы данных/данных.

person Sean    schedule 14.11.2013