Могу ли я сравнить два файла ms-access?[закрыто]

StackOverflow https://stackoverflow.com/questions/239450

  •  04-07-2019
  •  | 
  •  

Вопрос

Я хочу сравнить два файла .mdb ms-access, чтобы убедиться, что содержащиеся в них данные одинаковы в обоих.

Как я могу это сделать?

Это было полезно?

Решение

Я делал подобные вещи в коде много-много раз, в основном в тех случаях, когда к локальному MDB нужно было применять обновления, извлеченные из данных, введенных на веб-сайте. В одном случае веб-сайт управлялся MDB, в других это была база данных MySQL. Для MDB мы только что загрузили его, для MySQL мы запустили сценарии на веб-сайте для экспорта и текстовых файлов FTP.

Теперь главное, что мы хотели сравнить данные в локальном MDB с данными, загруженными с веб-сайта, и обновить локальный MDB, чтобы отразить изменения, внесенные на веб-сайте (нет, невозможно было использовать один источник данных - это было первое, что я предложил, но это было неосуществимо).

Давайте назовем MDB A вашей локальной базой данных, а MDB B - той, которую вы загружаете для сравнения. Что вы должны проверить это:

<Ол>
  • записи, которые существуют в MDB A, но отсутствуют в MDB B. Они могут или не могут быть кандидатами на удаление (это будет зависеть от ваших конкретных данных).

  • записи, которые существуют в MDB B, но отсутствуют в MDB A. Эти записи будут добавляться из MDB B в MDB A.

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

  • Шаги № 1 и № 2 довольно легко выполнить с помощью запросов, использующих внешнее соединение для поиска отсутствующих записей. Шаг 3 требует некоторого кода.

    Принцип, лежащий в основе кода, состоит в том, что структура всех таблиц в обоих MDB идентична. Таким образом, вы используете DAO для обхода коллекции TableDefs, открытия набора записей и обхода коллекции полей для запуска оператора SQL для каждого столбца каждой таблицы, который либо обновляет данные, либо выводит список различий.

    Базовая структура кода:

      Set rs = db.OpenRecordset("[SQL statement with the fields you want compared]")
      For Each fld In rs.Fields
        ' Write a SQL string to update all the records in this column
        '   where the data doesn't match
        strSQL = "[constructed SQL here]"
        db.Execute strSQL, dbFailOnError
      Next fld
    

    Теперь основная сложность заключается в том, что ваше предложение WHERE для каждого поля должно быть различным - текстовые поля должны обрабатываться иначе, чем числовые поля и поля данных. Таким образом, вы, вероятно, захотите SELECT CASE, который записывает ваше предложение WHERE на основе типа поля:

      Select Case fld.Type
        Case dbText, dbMemo
        Case Else
      End Select
    

    Вы хотите использовать Nz () для сравнения текстовых полей, но для этого следует использовать Nz (TextField, ''), а Nz (NumericField, 0) - для числовых полей или полей даты.

    Мой пример кода на самом деле не использует приведенную выше структуру для определения предложения WHERE, потому что он ограничен полями, которые работают очень хорошо, сравнивая сцепленные с ZLS (текстовые поля). То, что ниже, довольно сложно прочитать, но в основном это расширение вышеуказанной структуры.

    Он был написан для эффективности обновлений, поскольку он выполняет SQL UPDATE для каждого поля таблицы, что намного эффективнее, чем выполнение SQL UPDATE для каждой строки. Если, с другой стороны, вы не хотите делать обновление, но хотите получить список различий, вы можете относиться ко всему по-другому. Но это становится довольно сложным в зависимости от вывода,

    Если все, что вы хотите знать, это то, что два MDB идентичны, вы сначала должны проверить количество записей в каждой таблице, а если у вас есть одно несоответствие, вы выходите и говорите пользователю, что MDB не тот же самый. Если учетные записи одинаковы, то вам нужно проверять поле за полем, что, на мой взгляд, лучше всего сделать с динамическим написанием SQL по столбцам - как только один из полученных SQL SELECTS возвращает 1 или более записей, вы отменяете и скажите своему пользователю, что MDB не идентичны.

    Сложная часть - если вы хотите записать различия и проинформировать пользователя, но углубление в это сделало бы этот уже нескончаемый пост еще длиннее!

    Далее следует только часть кода из большой подпрограммы, которая обновляет сохраненный запрос qdfOldMembers (из MDB A) с данными из qdfNewMembers (из MDB B). Первый аргумент, strSQL, является оператором SELECT, ограниченным полями, которые вы хотите сравнить, в то время как strTmpDB является путем / именем файла другого MDB (в нашем примере MDB B). Код предполагает, что strTmpDB имеет уже созданные qdfNewMembers и qdfOldMembers (

    Другие советы

    Вы можете попробовать AccessDiff (платный продукт). Имеет возможность сравнивать схему, данные, а также получать доступ к объектам. Он имеет графический интерфейс, а также интерфейс командной строки.

    Раскрытие: я создатель этого инструмента.

    Возьмите текстовые дампы таблиц базы данных и просто сравните дампированные текстовые файлы, используя BeyondCompare (или любой другой инструмент для сравнения текста). Грубый но может работать!

    У меня очень хороший опыт работы с Компаратором кросс-баз данных . Умеет сравнивать структуру и / или данные.

    См. раздел «Сравнение баз данных Access» в разделе сторонних утилит, продуктов, инструментов Microsoft Access. , модули и т. д. на моем веб-сайте.

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

    Если вы хотите узнать, идентичны ли файлы, тогда

    fc file1.mdb file2.mdb 
    

    в командной строке DOS.

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

    Существуют некоторые инструменты, которые сделают это за вас, но все они выглядят как условно-бесплатные.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top