Итак, данная статья будет посвящена расширению компонентов ADO - ADOX. Библиотека ADOX, возможно в настоящее время, не очень используется, тут скорее всего больше ее заменяют SQL-запросы, но все же, мы ее поверхностно рассмотрим.
Данная библиотека, поможет нам, с помощью компонентов, классов, создавать базу данных MS Access, создавать таблицы MS Access, а также поля, в том числе и ключевые. На самом деле мне нравится данный инструмент, так как с помощью него, можно спокойно делать резервные копии БД MS Access, это мы рассмотрим дальше, после того, как научимся получать список таблиц, а также список полей в БД.

В этой статье, мы рассмотрим, как импортировать данную библиотеку в проект Delphi, на примере IDE Delphi 7. С другой IDE , проблем возникнуть, я думаю, не должно.

Ну, что приступим. Выполним команду Project-Import Type Library…, после чего появится окно и в данном окне, выбираем Microsoft ADO Ext. 6.0 for DLL  and Security (Version 6.0), после чего нажимаем Create Unit, если у Вас в списке только более ранняя версия или наоборот, выбирайте ее:


После, создаем проект и в него подключаем модуль, в uses, ADOX_TLB, кроме этого на форму нашего проекта я поместил TButton.

Теперь, давайте определимся, что у нас будет происходить по нажатию на кнопку, я составил следующее:

  • создаваться БД (файл MDB)
  • создаваться таблица (TestTable)
  • создаваться ключевое поле (id-счетчик)
  • создаваться поля, других типов данных (Фамилия-Текстовый, Возраст-Целочисленный)

Тут, мы определились. Теперь начнем с создания нашей БД. Для создания новой БД, в модуле ADOX_TLB, описан тип — _Catalog, вот им мы и воспользуемся. Для создания правильного файла БД, необходимо написать следующий код:

procedure TForm1.Button1Click(Sender: TObject);
var
 DB:Catalog;
 Tables:Table;
 Columns:Column;
begin
   DB:=CoCatalog.Create;
   DB.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\test.mdb');
   DB.Set_ActiveConnection('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\test.mdb');
end;

Тут все очень просто, при помощи функции Create, создаем наш mdb-файл, при этом указывая тип подключения, а также расположение нашей БД. Если файл, уже существует, то естественно будет ошибка. Дальше, при помощи процедуры Set_ActiveConnection устанавливаем активное подключение к нашей БД, чтобы можно было с ней работать, в дальнейшем. Думаю тут все понятно

Теперь приступим к созданию нашей таблицы, в наше БД. Для этого существует тип _Table. Необходимо вначале проинициализировать переменную, после чего указать имя таблицы, а также указать имя БД, к которой будет принадлежать наша таблица, вот такой код это делает:

procedure TForm1.Button1Click(Sender: TObject);
var
 DB:Catalog;
 Tables:Table;
 Columns:Column;
begin
   DB:=CoCatalog.Create;
   DB.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\test.mdb');
   DB.Set_ActiveConnection('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\test.mdb');
   Tables:=CoTable.Create;
   Tables.Name:='TestTable';
   Tables.ParentCatalog:=DB;
   DB.Tables.Append(Tables);
end;

Инициализируем переменную Tables, затем с помощью свойства Name - задаем имя нашей таблицы, а с помощью свойства ParentCatalog, указываем базу данных, к которой будет принадлежать наша таблица, затем просто добавляем таблицу в нашу БД.

Теперь приступаем к созданию наших полей, для этого существует тип — _Column, но можно обойтись и без него, что дальше мы и рассмотрим это. Начнем мы с создания ключевого поля, для этого необходимо задать его имя, задать ему тип данных, а также указать, что оно будет автоматически увеличиваться, при добавлении новой записи в БД, то есть increment, ну и добавить описание данного поля. Делается это, следующим образом:

procedure TForm1.Button1Click(Sender: TObject);
var
 DB:Catalog;
 Tables:Table;
 Columns:Column;
begin
   DB:=CoCatalog.Create;
   DB.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\test.mdb');
   DB.Set_ActiveConnection('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\test.mdb');
   Tables:=CoTable.Create;
   Tables.Name:='TestTable';
   Tables.ParentCatalog:=DB;
   DB.Tables.Append(Tables);
   Columns:=CoColumn.Create;
   with Columns do
    begin
     ParentCatalog:=DB;
     Name:='id';
     type_:=adInteger;
     Properties['Autoincrement'].Value:=True;
     Properties['Description'].Value:='Ключевое поле';
    end;
   Tables.Columns.Append(Columns,0,0);
end;

С помощью свойства Name - указываем имя нашего поля, затем с помощью свойства ParentCatalog - указываем БД, где находится наша таблица, с помощью свойства _type - указываем тип нашего поля, а с помощью свойства Properties - указываем описание поля, а также его тип, в нашем случае increment.

В самом конце добавляем в нашу таблицу поле, с помощью процедуры Append, где последние 2 параметра — 0, так как, мы уже указали тип нашего поля.

Ну, а теперь создадим оставшиеся поля — это Фамилия и Возраст, но уже не будем использовать тип _Column. Для этого, сразу воспользуемся процедурой Append объекта CoTable.

procedure TForm1.Button1Click(Sender: TObject);
var
 DB:Catalog;
 Tables:Table;
 Columns:Column;
begin
   DB:=CoCatalog.Create;
   DB.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\test.mdb');
   DB.Set_ActiveConnection('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\test.mdb');
   Tables:=CoTable.Create;
   Tables.Name:='TestTable';
   Tables.ParentCatalog:=DB;
   DB.Tables.Append(Tables);
   Columns:=CoColumn.Create;
   with Columns do
    begin
     ParentCatalog:=DB;
     Name:='id';
     type_:=adInteger;
     Properties['Autoincrement'].Value:=True;
     Properties['Description'].Value:='Ключевое поле';
    end;
   Tables.Columns.Append(Columns,0,0);
   Tables.Columns.Append('Фамилия',adVarWChar,255);
   Tables.Columns.Append('Возраст',adInteger,0);
end;

В итоге, у меня получилось следующее:


Исходник статьи, можно скачать тут


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


Метки: , , ,




К записи “Работа с ADO в Delphi. Часть 8. Библиотека ADOX” оставлено комментариев: 21.

  1. zerdalert:

    Андрей привет. Интересный вариант создания файла базы.
    Только вопрос появился. Ты пишешь:-»Если файл, уже существует, то естественно будет ошибка».
    А можно сделать так, чтобы если файл существует, выдать запрос типа: заменить файл более поздней версией? Если да заменить, Если нет, то оставить прежний файл? Как нибудь так… ну чтоб ошибки не было?
    :)

    • Andrey53:

      Здравствуй, Можно так сделать, просто проверять на существование файла БД
      if FileExists(‘C:\test.mdb’)=True then
      begin
      if application.messagebox(‘Заменить файл’,’Внимание’,MB_YESNO)=IDYES then
      begin
      DeleteFile(‘C:\test.mdb’);//удаляем старую версию файла
      //тут код создания новой версии файла
      end;
      end;
      Код писал тут, могут быть ошибки, ну как-то так примерно, просто проверить на существование, если существует и пользователь хочет заменить, то удаляем старую версию файла, а затем создаем новую, если нажал нет, то ничего не делаем.

  2. Павел:

    Оно и без того просто создается:

    var
    cat: OLEVariant; //создание бд
    begin
    cat := CreateOleObject('ADOX.Catalog');
    cat.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+ path+'\base.db;');

    а таблица так:
    AdoQuery.SQL.Text:='CREATE TABLE `additional` ([id] AUTOINCREMENT,'+
    '[id_main] INTEGER NOT NULL,'+
    '[comment] TEXT NOT NULL,'+
    'PRIMARY KEY ([id]))';
    AdoQuery.ExecSQL;

    end;

  3. Юра:

    как сделать штоби пользователь сам мог виберать место куда сохраняетца база и имя етой бази ?

  4. Юра:

    спс з TSaveDialog розобрався .А как сделать штоби по нажатию кнопки добавлялось поле?

    • Andrey53:

      ну тут же написано как создавать поле в БД, точно также отдельно пишите на OnClick кнопки создание поля, которое Вам необходимо

  5. Юра:

    последний вопрос , если например у нас есть база данних в базе 3 таблици , как удалить 1-ну таблицу которую нужно ?

  6. Юра:

    сорь за елементарние вопроси просто нада диплом доделать а я в delphi почти 0))

  7. Юра:

    спс попробую розобратца , на завтра нада)))

  8. Юра:

    если можеш помоги плиз

  9. Юра:

    я уже разобралса как удалить таблицу. Теперь неполучаетца удалить и добавить поля)))

  10. Юра:

    как проверить прри добавлении поля есть поле с таким именем в таблице или нет ?

    • Andrey:

      легко, можно получить идентификатор поля AdoQuery.FieldsValue['имя поля'] если поле такое есть, то будет все без ошибок, если нету, то соответсвенно ошибка будет

  11. wolf:

    И где же как резервные копии БД MS Access?

    • Andrey:

      создаешь базу таким путем, как описано здесь и со своей базы при запуске проекта SQL-запросами переносишь информацию в БД и так каждый раз

  12. ErYdit:

    А как теперь можно удалить эту библиотеку?)

    • Andrey:

      с этого же окна, только нажать на кнопку Remove (предварительно конечно же ее выделить)

Оставить комментарий на Павел

Вы можете использовать следующие теги:

*