BatchAccess
Первая версия этой утилиты была опубликована с исходными кодом (Создание базы данных MS Access из SQL-скрипта); все, что она могла, — это создавать новый MDB-файл и выполнять SQL-скрипт. На этот раз, с соглашения руководства компании, я публикую гораздо более полезную версию утилиты, но БЕЗ исходного кода.
BatchAccess
Предупреждение
Утилита BatchAccess предоставляется компанией Русские Информационные Технологии на условиях «Как Есть», без предоставления каких-либо гарантий и прав. Используя Используя утилиту BatchAccess, вы соглашаетесь с тем, что компания Русские Информационные Технологии не несет ответственности за использование вами данной утилиты, а также с тем что вы принимаете на себя весь риск, связанный с использованием данной утилиты. |
Что такое BatchAccess
BatchAccess — небольшая утилита, написанная в компании Русские Информационные Технологии. Мы создали ее в ходе работы над программным продуктом, работающим с базой данных MS Access.
Целью было — перейти от описания базы средствами Access к описанию в виде SQL-скрипта. Работа со скриптом имеет ряд преимуществ по сравнению с использованием MDB-файла:
| SQL-скрипт |
MDB-файл |
| Текст, который легко читать и править любым текстовым редактором |
Бинарный закрытый формат, для работы требует установленный MS Access |
| Малый объем — несколько килобайт текста полностью описывают сложную БД |
Значительный объем — даже пустая БД занимает 65536 байт |
| Удобство хранения в системах контроля версий — CVS, VSS и т.п. |
Неудобство хранения в системах контроля версий из-за бинарного формата |
| Легкость нахождения отличий от предыдущей версии базы |
Найти все отличия данной версии БД от предыдущей — практически нереально |
Сейчас с помощью BatchAccess мы решаем следующие задачи:
- Создание пустой базы данных
- Выполнение SQL-скрипта над заданной базой данных
- Задание структуры базы данных — таблиц, связей, индексов, процедур
- Наполнение таблиц — из SQL-скриптов либо из CSV-файлов
- Восстановление SQL-скрипта структуры по имеющейся базе данных
- Восстановление SQL-скрипта данных по имеющейся базе данных
- Экспорт данных в CSV-файл и импорт из него
- Сжатие/восстановление базы данных
- Построение SQL-скрипта различий между двумя базами
Требования
.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-оператор составляется из нескольких строк, начиная с начала файла, до тех пор пока не встретится строка в конце которой стоит символ <точка с запятой designtimesp=15854> (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-скрипта различия структуры двух баз. База, заданная в параметре, считается <старой designtimesp=15898>, база, заданная вне параметров - <новой designtimesp=15899>, а полученный скрипт содержит операторы для перехода от <старой designtimesp=15900> к <новой designtimesp=15901> базе.
Информация о структуре баз получается с помощью ADOX.
Опции-модификаторы
-b или -brackets
Требует, чтобы в скрипте, создаваемом программой, квадратные скобки «[]» использовались для каждого идентификатора. Без этой опции квадратные скобки используются только для идентификаторов, которые не могут быть использованы напрямую.
-q или -quiet
<Тихий DESIGNTIMESP=15912> режим — показываются только сообщения об ошибках и предупреждения, информационные сообщения не показываются.
-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]; |
|