Статьи Королевства Дельфи


Как достать SQL запрос из *.mdb без MS Access - часть 2


Начал с простого окна, в котором было TMemo - для текста запроса, и кнопка для выполнения этого запроса. CheckBox - для указания, возвращать мне результат запроса, или нет. Второе окно открывалось с DBGrid-ом, в котором был результат выполнения запроса. Третье окно - ListBox, который содержал список таблиц и запросов базы данных (макросы, отчеты и формы Access я не умею доставать и сейчас, даже не знаю где это прячут). По двойному щелчку на элементе списка открывалось все то-же окно с DBGrid-ом, где можно было посмотреть содержимое таблицы или запроса.

Первую базу данных я создал с помощью системного менеджера ODBC - там есть такая возможность! Первые таблицы приходилось создавать с помощью инструкций SQL. Я был приятно удивлен, что Access умеет через SQL такие вещи, которые нигде в справке по Access не описаны. К этим возможностям относится параметр DEFAULT в инструкции CREATE TABLE. В справке к Access о нем нет ни слова! А в справке по InterBase – есть. Я попробовал – очень прекрасно устанавливаются значения по умолчанию для поля создаваемой таблицы. Короче говоря, кто ищет – найдет. Первые запросы и процедуры приходилось сохранять в текстовом виде, чтобы после корректировки удалить из базы данных сохраненный запрос и внести откорректированный. Потом я попытался достать текст запроса из базы данных через ADO – не получилось, не получилось и до сих пор. Пришлось выбрать другой путь. Если это делает Microsoft – почему не могу это делать я?

Так вот, если посмотреть в системные таблицы, то там есть вся необходимая информация (или почти вся). Используя ее можно написать парсер, который будет собирать текст запроса, используя формат записи самой Microsoft. А сохранить потом измененный запрос (помним: или процедуру) с помощь инструкции CREATE VIEW или CREATE PROCEDURE.

Формат хранения SQL запроса в Access.
Сразу оговорюсь, что все это возможно только с правами администратора на базу данных (Еще один плюс в пользу Access).

Ниже привожу таблицу с описанием всего, что мне удалось раскопать по этому поводу. Используя эту информацию, я написал парсер, который собирает это все в текст запроса. Я не претендую на полноту изложения, потому, что еще не полностью разобрал эту информацию, но возможно это поможет кому-то. Буду рад помощи, если кто что-то знает по этой теме. По крайней мере процентов 70 запросов расшифровываются и выполняются так как было задумано.

Соглашения по обозначениям: Если что-то не описано – я не разбирался – не было необходимости, или не наводило на мысль.

  • Знаки ????? обозначают, что я очень сомневаюсь в правильности описанной информации.
  • Пустые ячейки — в моей практике не встречалось.
  • [Что-то] – обобщенный тип значения, например если в поле встречается только 1 или 2 или 3 – я пишу Integer, даже если
  • тип поля – текстовый.
  • < N > - переменная или значение.
  • ... - часть запроса не критичная для описания. (для наглядности).
  • Описание курсивом – то, что понадобится для разбора запроса.
1. Внешний вид записи таблицы MSysObjects (все объекты базы данных).
Connect Database DateCreate DateUpdate Flags ForeignName Id Lv LvExtra LvModule LvProp Name Owner ParentId RmtInfoLong RmtInfoShort Type
01.10.2003 16:43:35 16.10.2003 15:26:43 0 447 (Blob) (Blob) (Blob) (Blob) r_Cash (VarBytes) 251658241 (Blob) (VarBytes) 1
Где:
  • DateCreate – дата и время создания объекта.
  • DateUpdate – дата и время последнего изменения объекта.
  • Flags – не изучалось.
  • ForeignName – имя во внешней базе данных для связанных таблиц.
  • Id – уникальный код объекта в базе данных.
  • Name – имя объекта. (Многие объекты в таблице не являются хранилищами данных, и найти их в базе данных или через Access нельзя.)
  • Type – тип объекта (1-таблица, 3-контейнер, 5-запрос,8-внешний индекс и.т.д.)




Начало  Назад  Вперед



Книжный магазин