BatchAccess: консольная утилита для управления базами MS Access
Версия 1.3

Автор: Никита А. Зимин
Русские Информационные Технологии (www.russianit.ru)
Опубликовано: 2.05.2005
Версия текста: 1.3

BatchAccess
Что такое BatchAccess
Требования
Как это работает
Как пользоваться

Первая версия этой утилиты была опубликована с исходными кодом (Создание базы данных MS Access из SQL-скрипта); все что она могла — это создавать новый MDB-файл и выполнять SQL-скрипт. На этот раз, с соглашения руководства компании, я публикую гораздо более полезную версию утилиты, но БЕЗ исходного кода.

BatchAccess

ПРЕДУПРЕЖДЕНИЕ

Утилита BatchAccess предоставляется компанией Русские Информационные Технологии на условиях «КАК ЕСТЬ», без предоставления каких-либо гарантий и прав. Используя утилиту BatchAccess, вы соглашаетесь с тем, что компания Русские Информационные Технологии не несет ответственности за использование вами данной утилиты, а также с тем что вы принимаете на себя весь риск, связанный с использованием данной утилиты.

Что такое BatchAccess

BatchAccess — небольшая утилита, написанная в компании Русские Информационные Технологии. Мы создали ее в ходе работы над программным продуктом, работающим с базой данных MS Access.

Целью было — перейти от описания базы средствами Access к описанию в виде SQL-скрипта. Работа со скриптом имеет ряд преимуществ по сравнению с использованием MDB-файла:

SQL-скрипт MDB-файл
Текст, который легко читать и править любым текстовым редактором Бинарный закрытый формат, для работы требует установленный MS Access
Малый объем — несколько килобайт текста полностью описывают сложную БД Значительный объем — даже пустая БД занимает 65536 байт
Удобство хранения в системах контроля версий — CVS, VSS и т.п. Неудобство хранения в системах контроля версий из-за бинарного формата
Легкость нахождения отличий от предыдущей версии базы Найти все отличия данной версии БД от предыдущей — практически нереально

Сейчас с помощью BatchAccess мы решаем следующие задачи:

Требования

.NET Framework 1.1

MDAC

Microsoft Jet Driver 4.0

ПРИМЕЧАНИЕ

Устанавливать MS Access НЕ ТРЕБУЕТСЯ!

Как это работает

Утилита с интерфейсом командной строки. На входе — имя БД, имя SQL-скрипта и опции. Опции позволяют указать — использовать существующую базу или создать новую.

SQL-скрипт исполняется используя Jet Driver через OleDB. Некоторые операции над базой данных выполняются через ADOX.

В зависимости от опций, программа работает в одном из четырех режимах:

Прогон скрипта на существующей или новой базе [–c]
Создание скрипта на основе структуры заданной базы –r
Создание скрипта но основе данных заданной базы –d
Импорт данных из CSV-файла в одну из таблиц –iTABLENAME
Экспорт данных из таблицы в CSV-файл –eTABLENAME
Построение скрипта различий между двумя базами –mMDBFILENAME

Прогон скрипта

SQL-скрипт — текстовый файл, состоящий из 8-битных символов в кодировке, принятой в системе по умолчанию (обычно — Windows-1251). Пробелы вначале и в конце строки — игнорируются. Пробелами считаются символ пробел (ASCII код 32) и символ табуляции (ACSII код 9). Комментарии — любые строки, в начале которых (не считая ведущих пробелов) стоит два знака минус (ASCII код 45). Пустые строки — игнорируются.

SQL-оператор составляется из нескольких строк, начиная с начала файла, до тех пор пока не встретится строка в конце которой стоит символ «точка с запятой» (ASCII код 59) — эта строка считается последней строкой оператора. Следующая строка считается первой строкой следующего SQL-оператора.

Файл скрипта парсится — отбрасываются комментарии и пустые строки, выделяются SQL-операторы. Затем устанавливается соединение (Jet OleDB) и один за другим выполняются операторы, возникающие ошибки — протоколируются.

Как пользоваться

Формат вызова

BatchAccess.exe <Файл_БД> <Файл_Скрипта> [<Опции>]

Опции отличаются от остальных параметров наличием символа – или /. Параметры могут идти в любом порядке, важно только взаимное расположение параметров Файл_БД и Файл_Скрипта: первый параметр НЕ-опция считается Файл_БД, следующий — Файл_Скрипта.

Опции-режимы

–h или –help

Получение краткой справки по использованию программы.

–c или –create

Создает новый файл базы данных. Если файл уже существует, возникнет ошибка.

Создание базы данных происходит с использованием ADOX.

–r или –restore

Восстановить по базе данных SQL-скрипт структуры.

Информация о структуре базы получается с помощью ADOX.

–d или –data

Восстановить по базе данных SQL-скрипт данных — для каждой таблицы генерируется набор операторов INSERT.

Текстовые поля: символы с ASCII-кодом меньше 32, а также не-буквы с ASCII-кодом больше 127 восстанавливаются в виде «Chr(xx)».

–iTABLENAME

Импортировать CSV-файл в заданную таблицу. В качестве параметра Файл_Скрипта задается имя CSV-файла.

–eTABLENAME

Экспортировать указанную таблицу в CSV-файл. В качестве параметра Файл_Скрипта задается имя CSV-файла. Если такой CSV-файл уже существует, он будет переписан.

–oOUTNAME

Перенаправить вывод в заданный файл.

–mMDBFILENAME

Получение SQL-скрипта различия структуры двух баз. База, заданная в параметре, считается «старой», база, заданная вне параметров — «новой», а полученный скрипт содержит операторы для перехода от «старой» к «новой» базе.

Информация о структуре баз получается с помощью ADOX.

Опции-модификаторы

–b или –brackets

Требует, чтобы в скрипте, создаваемом программой, квадратные скобки "[]" использовались для каждого идентификатора. Без этой опции квадратные скобки используются только для идентификаторов, которые не могут быть использованы напрямую.

–q или –quiet

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

–sdn, –sdr, –sdw, –se

Режим совместного использования базы данных — Share Deny None (по-умолчанию), Share Deny Read, Share Deny Write, Share Exclusive (монопольный доступ к БД)

–pPASSWORD

Пароль для доступа к базе данных. Может использоваться как при создании базы, так и при обычном прогоне скрипта.

–compact

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

Примеры вызова

Создание базы данных SuperPuper.mdb и выполнение скрипта structure.sql:

BatchAccess SuperPuper.mdb structure.sql –c

Выполнение скрипта data.sql над базой данных SuperPuper.mdb:

BatchAccess -quiet SuperPuper.mdb data.sql

Восстановление скрипта структуры базы данных SuperPuper.mdb в файл structure.sql:

BatchAccess -r SuperPuper.mdb structure.sql

Получение скрипта данных для базы данных SuperPuper.mdb в файл data.sql:

BatchAccess SuperPuper.mdb -d data.sql

Импорт данных в SuperPuper.mdb в таблицу Contact из файл contact.csv:

BatchAccess SuperPuper.mdb -iContact contact.csv

Экспорт данных из таблицы Contact в файл contact.csv:

BatchAccess SuperPuper.mdb -eContact contact.csv

Получение скрипта перехода от db1.mdb к db2.mdb:

BatchAccess db2.mdb –mdb1.mdb compare.sql

Мета-операторы

В целом, BatchAccess позволяет сделать многое. Но его возможности опираются на Jet SQL, возможностей которого часто оказывается недостаточно. Например, используя только Jet SQL вы не сможете подцепить к базе данных внешнюю таблицу, или сжать/восстановить базу данных.

Когда нам понадобились эти возможности, мы решили расширить Jet SQL за счет мета-операторов. Суть в том что мы ввели ряд собственных операторов, которые не передаются на исполнение в Jet, а выполняются самим BatchAccess.

Все мета-операторы начинаются с символа решетки — «#». Так же как и для обычных операторов, концом оператора считается символ точки с запятой, стоящий в конце строки.

Поддерживаются следующие мета-операторы:

#COMPACT DATABASE;

Сжатие/восстановление базы данных.

#LINK TABLE <TableName> DATABASE <DatabasePath> [REFERENCES <RemoteTableName>] [PROVIDER <ProviderString>];

Подключение к базе данных внешней таблицы TableName из файла базы данных DatabasePath. Если DatabasePath содержит спецсимволы, заключите путь в квадратные скобки. Если в данной базе таблица должна иметь другое имя, укажите RemoteTableName. Параметр ProviderString позволяет подключать таблицы форматов, отличных от MDB — например, лист Excel или таблицу dBase.

#UPDATE LINK <TableName> DATABASE <DatabasePath>;

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

#IMPORT TABLE <TableName> FROM <CsvFilePath>;

Работает аналогично ключу –iTABLENAME: импортирует данные в заданную таблицу из заданного CSV-файла.

#INCLUDE <ScriptFile>;

Выполнение SQL-скрипта из заданного файла.

При появлении цикла на метаоператорах #INCLUDE, т.е. при включении через этот оператор того же самого файла — произойдет уход в рекурсию с переполнением стека.

ErrorLevel

Код завершения программы (ErrorLevel) бывает таким:

0 Все в порядке
1 При выполнении были проблемы - выдавались предупреждения
2 Проблемы при файловых операциях
3 Ошибки в командной строке
4 Исключение

Примеры использования

Пример SQL-скрипта — создание таблицы (sample.sql):

CREATE TABLE Manager (
    manager_id  AutoIncrement NOT NULL,
    FirstName   String(50) NOT NULL,
    MiddleName  String(50),
    LastName    String(50) NOT NULL,
    Sex         Bit,
    Birthday    Date,
    CONSTRAINT Manager_PK PRIMARY KEY (manager_id)
);

Создание базы данных Sample.mdb и выполнение скрипта sample.sql:

BatchAccess Sample.mdb sample.sql –c

Теперь восстановим структуру базы данных:

BatchAccess –r Sample.mdb sample_r.sql

Получаем файл sample_r.sql:

-- SQL script generated using BatchAccess utility

-- Tables

CREATE TABLE Manager (
    Birthday                DateTime,
    FirstName               Text(50) NOT NULL,
    LastName                Text(50) NOT NULL,
    manager_id              AutoIncrement NOT NULL,
    MiddleName              Text(50),
    Sex                     Bit NOT NULL,
    CONSTRAINT Manager_PK PRIMARY KEY (manager_id)
);


-- Constraints


-- Indexes


-- Views

-- Procedures

-- End

Пример SQL-скрипта — наполнение данными (data.sql):

INSERT INTO Manager
    (FirstName, LastName, Sex, Birthday) VALUES
    ("Johnson", "Anne", True, "21.12.1973");
INSERT INTO Manager
    (FirstName, LastName, Sex, Birthday) VALUES
    ("Strongarm", "Bill", False, "30.04.1972");

Выполняем data.sql:

BatchAccess Sample.mdb data.sql

Те же самые данные можно было бы импортировать из CSV-файла:

BatchAccess Sample.mdb -iManager Manager.csv

Manager.csv:

"FirstName";"LastName";"Sex";"Birthday"
"Johnson";"Anne";True;21.12.1973
"Strongarm";"Bill";False;30.04.1972

Теперь восстановим данные из базы:

BatchAccess -d Sample.mdb sample_d.sql

Получаем файл sample_d.sql:

-- SQL script generated using BatchAccess utility

-- Manager
INSERT INTO Manager (manager_id, FirstName, MiddleName, LastName, Sex, Birthday) VALUES (
    1, "Johnson", NULL, "Anne", True, #12/21/1973 00:00:00#);
INSERT INTO Manager (manager_id, FirstName, MiddleName, LastName, Sex, Birthday) VALUES (
    2, "Strongarm", NULL, "Bill", False, #04/30/1972 00:00:00#);

-- End

Пример подключения к базе внешних таблиц:

#LINK TABLE [Regions] DATABASE [.\codes.mdb];
#LINK TABLE [Settlements] DATABASE [.\codes.mdb];
#LINK TABLE [SubRegions] DATABASE [.\codes.mdb];

-- Подключение листа Excel
#LINK TABLE IssueNavigator
    DATABASE [C:\TEMP\a.xls] REFERENCES IssueNavigator$
    PROVIDER [Excel 5.0;HDR=NO;IMEX=2;];

-- Подключение DBF-таблицы Pindx4.dbf
#LINK TABLE PIndx4
    DATABASE [C:\TEMP\postindex] REFERENCES PIndx4#DBF
    PROVIDER [dBase 5.0;HDR=NO;IMEX=2;];

Пример обновления связи с внешней таблицей:

#UPDATE LINK Regions
    DATABASE [codes.mdb];


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