Печатать книгуПечатать книгу

§ 19. Компоненты для работы с базами данных

Сайт: Профильное обучение
Курс: Информатика. 11 класс (Повышенный уровень)
Книга: § 19. Компоненты для работы с базами данных
Напечатано:: Гость
Дата: Пятница, 3 Май 2024, 11:46

19.1. Технология ADO

Системы управления базами данных (СУБД) — это программные средства, предназначенные для создания, наполнения, обновления и удаления баз данных. По реализации СУБД можно выделить три основных вида (пример 19.1). Заказные СУБД требуют существенных затрат при разработке, однако заказные СУБД в максимальной степени учитывают специфику работы заказчика (того или иного предприятия), их интерфейс обычно интуитивно понятен пользователям и не требует от них специальных знаний.

Среда программирования C++Builder обладает мощными средствами для разработки СУБД (пример 19.2).

Мы будем рассматривать работу с БД, основанную на технологии ADO. И хотя скорость доступа к данным, обеспечиваемая технологией ADO, ниже, чем при использовании других технологий, она не требует установки дополнительных программных средств.

Технология ADO (ActiveX Data Object) обеспечивает механизм доступа к данным, разработанный корпорацией Microsoft, посредством которого можно связываться с различными данными приложений Microsoft. Позволяет представлять данные из разнообразных источников (реляционных баз данных, текстовых файлов и т. д.) в объектно-ориентированном виде.

В соответствии с терминологией ADO любой источник данных является хранилищем данных. Приложение взаимодействует с хранилищем данных с помощью интерфейса OLE. Для каждого типа хранилища данных используется свой интефейс ADO. Интерфейс обеспечивает обращение к данным хранилища с запросами, интерпретацию возвращаемой служебной информации и результатов выполнения запросов для передачи их приложению (пример 19.3).

Применяя техногию ADO, можно в качестве хранилища данных использовать базы данных, созданные в MS Access (пример 19.4). Файл БД должен иметь формат MBD.

Пример 19.1. Классификация СУБД:

Пример 19.2. Технологии работы с БД, поддерживаемые в С++Builder:

Пример 19.3. Механизм технологии ADO:

 

Пример 19.4. Преимущества БД MS Access:

1) Все таблицы БД хранятся в одном файле, что облегчает создание резервных копий, переносимость на другие компьютеры.

2) Поля в таблице можно называть по-русски.

19.2. Компоненты для работы с базой данных

Компоненты для работы находятся на панели dbGo (пример 19.5).

  • ADOConnection — ADO-соединение, используется для установки соединения с ADO-источником данных;
  • ADODataSet — набор данных ADO;
  • ADOTable — таблица ADO, обеспечивает доступ к одной таблице ADO-источника данных и позволяет другим компонентам управлять этими данными, связываясь с компонентом ADOTable через компонент DataSource;
  • ADOQuery — запрос ADO, позволяет выполнять SQL-команды.

Для визуализации данных используются компоненты панели Data Controls (пример 19.6). Для обеспечения связи между визуальными компонентами и компонентами, обеспечивающими технологию ADO, используют компонент DataSource, расположенный на вкладке Data Access (пример 19.7).

Таким образом, для работы с базами данных по технологии ADO на форме необходимо размещать компоненты (пример 19.8):

  1. обеспечивающие реализацию технологии ADO;
  2. обеспечивающие визуализацию табличных данных;
  3. обеспечивающие связь между технологическими и визуальными компонентами.

Пример 19.9. Создать проект, который позволит просматривать таблицу базы данных.

Этапы выполнения задания

  1. Разместить на форме компоненты ADOTable и ADOConnection (палитра dbGo), DataSource (палитра Data Access). DBGrid и DBNavigator (палитра Data Controls), Button и LabeledEdit.
  2. Настроить соединение с базой данных Академики.mdb, созданной в Access (файл разместить в папке Win32\Debug), используя ConnectionString (пример 19.10).
    2.1. Установить значение false для свойства LoginPromt (для того, чтобы при запуске не запрашивался пароль на доступ к БД).
    2.2. Двойной щелчок по компоненту ADOConnection1 откроет окно настроек.
    2.3. На вкладке Поставщик данных выбираем Microsoft Jet 4.0 OLE DB Provider.
    2.4. На вкладке Соединение выбираем файл с базой данных.
  3.  Установить для компонента ADOTable1 следующие значения свойств:
    3.1. Connection — ADOConnection1.
    3.2. TableName — выбрать из выпадающего списка имя таблицы: Члены-корреспонденты Академии наук Беларуси.
    3.3. Active — true.
  4. Установить значение ADOTable1 для свойства DataSet компонента DateSource1.
  5. Установить значение DateSource1 для свойства DateSource компонентов DBGrid1 и DBNavigator.
  6. Настраиваем поля таблицы (пример 19.11):
    6.1. Двойным щелчком по компоненту DBGrid1 (таблице) открываем список полей.
    6.2. В появившемся списке поочередно выбираем каждое поле и в инспекторе объектов меняем свойство DisplayWidth (в зависимости от контекста).
    6.3. Отключаем свойство Active у ADOTable1.
  7. Написать обработчик события onClick для кнопки (пример 19.12).

Одна из самых рапространенных операций, которая выполняется с таблицей БД — это построение запросов на поиск записей, удовлетворяющих условию. Для этого можно просмотреть все записи и проверить значения в соответствующих полях. Для посмотра записей таблицы используют методы компонента ADOTable: First, Last, Prior, Next, которые перемещают указатель текущей записи на первую, последнюю, следующую и предыдущую записи соответственно.

Для доступа к значениям полей используется свойство Filds, которое хранит массив значений полей. Обращение к каждому конктретному полю происходит по индексу.

Просмотр записей может осуществляться в цикле while с условием, пока не будет достигнут конец файла, или в цикле for по количеству записей в таблице.

Пример 19.13. Добавить в проект из примера 19.9 поиск по условию:

  1. количество ученых, получивших звание после введенного года;
  2. количество ученых, с указанной специализацией;
  3. самый ранний год присвоения звания;
  4. количество ученых, родившихся до введенной даты.

Этапы выполнения задания

  1. Добавить на форму компонент PageControl (компонент с вкладками).
  2. Из контекстного меню добавить две вкладки. Первую вкладку назвать «Таблица» и перенести на нее компоненты DBGrid, DBNavigator, Button и LabeledEdit.
  3. Вторую вкладку назвать «Поиск». Разместить на ней три LabeledEdit (для ввода условий), четыре компонента Button (для выполнения запроса) и четыре компонента Label (для размещения ответа).
  4. Написать обработчик OnClick для кнопок:
    4.1. установить указатель на первое поле;
    4.2. в цикле просмотреть все записи;
    4.3. для каждой записи проверить значение в том поле, которое указано по условию.

Для компонента ADOTable определены методы Insert, Edit, Delete, Append, которые переводят таблицу в режимы вставки, редактирования, удаления, добавления записи соответственно. Эти же методы визуализированы в виде кнопок компонента DBNavigator.

Метод Post осуществляет физическое сохранение измененных данных. При использовании компонента DBNavigator метод срабатывает авоматически.

Метод FieldByName предоставляет возможность обращения к данным в полях по имени поля.

Метод Refresh позволяет обновить отредактированную таблицу на форме.

Пример 19.5. Компоненты для работы с таблицами БД по технологии ADO:

Компонент ADOconnection может использоваться как посредник между данными и другими компонентами ADO. Возможен другой вариант организации связей. Для установления соединения с источником данных напрямую компоненты ADO имеют свойство ConnectionString, с помощью которого могут создавать свой собственный канал доступа к данным.

Пример 19.6. Компоненты для визуализации данных в таблицах БД:

Пример 19.7. Компонент для установки связи:

Пример 19.8. Реализация технологии ADO в C++Builder:

Пример 19.9. Форма на этапе проектирования:

Пример 19.10. Настройки ADOConnection:

Имя файла лучше указывать без пути к БД.

Пример 19.11. Настройка полей таблицы:

Пример 19.12. Обработчик события OnClick для кнопки.

void __fastcall TForm1::

Button1Click(TObject *Sender)

{

  ADOTable1 ->Active = true;

  LabeledEdit1->Text = 

    ADOTable1->RecordCount;

}

Работающее приложение:

Кнопки навигатора  позволяют добавлять и удалять строки в таблице. При этом изменения автоматически записываются в файл БД.

Пример 19.13. Форма на этапе проектирования:

Обработчики событий:

void __fastcall TForm1::

Button2Click(TObject *Sender)

{

  int k = 0;

  ADOTable1->First();

  //поиск по пятому полю 

  //"Год присвоения звания"

  while (!ADOTable1->Eof) {

    if (ADOTable1->Fields->

      Fields[5]->AsInteger > 

      LabeledEdit2->Text) {

      k++;

    }

    ADOTable1->Next();

  }

  Label1->Caption = k;

}

 

void __fastcall TForm1::

Button3Click(TObject *Sender)

{

  int k = 0;

  ADOTable1->First();

  //поиск по полю "Специализация"

  while (!ADOTable1->Eof) {

    if (ADOTable1->Fields->

      FieldByName("Специализация")->

      AsString == 

      LabeledEdit3->Text) {

      k++;

    }

    ADOTable1->Next();

  }

  Label2->Caption = k;

}

 

void __fastcall TForm1::

Button4Click(TObject *Sender)

{

   int k = 3000;

  ADOTable1->First();

  //поиск по пятому полю 

  //"Год присвоения звания"

  while (!ADOTable1->Eof) {

    if (ADOTable1->Fields->

      Fields[5]->AsInteger < k) {

      k = ADOTable1->Fields->

      Fields[5]->AsInteger;

    }

    ADOTable1->Next();

  }

  Label3->Caption = k;

}

 

void __fastcall TForm1::

Button5Click(TObject *Sender)

{

  int k = 0;

  ADOTable1->First();

  //поиск по второму полю 

  //"Дата рождения"

  for (int i = 0; i < ADOTable1->RecordCount; i++) {

    if (ADOTable1->Fields->

      Fields[2]->AsDateTime < 

      StrToDate(LabeledEdit4->Text)) {

      k++;

    }

    ADOTable1->Next();

    }

  Label4->Caption = k;

}

Работающее приложение:

19.3. Построение запросов на языке SQL

При реализации проектов по обработке БД на форме появляется большое количество невизуальных компонентов. Для того, чтобы они не загромождали форму, можно использовать модуль DataModule (пример 19.14). После этого добавляется невизуальный модуль Unit2, на котором можно размещать невизуальные компоненты (пример 19.15). Для того, чтобы компоненты были доступны модулю Unit1, необходимо его подключить:

#include "Unit2.h"

Аналогично нужно подключить модуль Unit1 в модуле Unit2.

Базы данных при выполнении запросов используют язык SQL. Компонент, который позволяет использовать запросы на языке SQL — ADOQuery. Работа компонента и настройка аналогичны компоненту ADOTable.

Для отображения всей таблицы в свойстве SQL компонента должен быть прописан запрос:

Select * From <имя таблицы БД>

Для выполнения запроса используется метод ExecSQL.

Пример 19.16. Создать проект, в котором необходимо реализовать возможность выполнения SQL запросов к базе данных Country.mdb.

Этапы выполнения задания

  1. Добавить в проект модуль DataModule с компонентами ADOConnection, ADOQuery и DataSource. Настроить свойства компонентов, как в примере 19.13.
  2. Добавить на форму компоненты DBGrid, Memo, Button.
  3. У свойства Active компонента ADOQuery1 установить значение true.
  4. Для отображения всей таблицы в свойстве SQL компонента ADOQuery1 прописать запрос (пример 19.17):
    Select * From Государства
  5. Реализовать возможность выполнения запроса, записанного в Memo, по нажатию кнопки (пример 19.18). Для этого необходимо текст из компонента Мемо передать свойству SQL компонента ADOQuery1 и затем выполнить запрос.

Пример 19.14. Добавление модуля DataModule.

  1. Выполнить команду File→New→Other…
  2. Выбрать С++Builder DataBase.
  3. Выбрать DataModule.
  4. Подключить Unit1 к Unit2 и Unit2 к Unit1.

Пример 19.15. Размещение невизуальных компонентов:

Пример 19.16. Форма на этапе конструирования:

Пример 19.17. Редактирование запроса для свойства SQL компонента :

Пример 19.18. Обработчик события OnClick для кнопки.

void __fastcall TForm1::Button1Click
                (TObject *Sender)

{

  DataModule2->ADOQuery1->SQL->Clear();

  DataModule2->ADOQuery1->Active = false;

  if (Memo1->Lines->Count > 0) {

    DataModule2->ADOQuery1->SQL->

    AddStrings(Memo1->Lines);

    DataModule2->ADOQuery1->ExecSQL();

    DataModule2->ADOQuery1->Active = true;

  }

}

Работающее приложение:

Вопросы к параграфу

1. Какие технологии применяются при создании СУБД средствами системы программирования C++Builder?

2. Какие компоненты используются для реализации технологии ADO?

3. Как устанавливается связь между компонентами ADO и визуальными компонентами на форме?

4. Какие методы позволяют просматривать записи таблицы?

5. Как можно обращаться к полям в таблице?

6. Какой компонент позволяет использовать запросы SQL?

7. Для чего предназначен модуль DataModule?


Упражнения

Для проекта из примера 19.13 добавьте следующие возможности:

  1. Добавить новую вкладу для компонента PageControl, которую следует назвать Форма.
  2. Разместить на вкладке «Форма» следующие компоненты:

    Компонент поле DBEdit расположен на вкладке DataControls. Для таких компонентов можно установить связи с полями базы данных, изменив их свойства в инспекторе объектов:

    3*. Добавить возможность смены шрифта и цвета для компонентов, расположенных на форме.

2. Реализуйте возможность добавления записей в таблицу с использованием дополнительной формы (для проекта примера 19.13).

    1. Разместите на вкладке «Таблица» кнопку «Добавить запись». Сделайте ее невидимой.
    2. Создайте новую форму в проекте: File-> New-> VCL Form — C++Builder.
    3. Сохраните форму в папку с проектом.
    4. Добавьте строку #include "Unit2.h" в файл Unit1.h. (возможность доступа ко второй форме из первой).
    5. Добавьте строку #include "Unit1.h" в файл Unit2.h. (возможность обращаться к компонентам первой формы из второй).
    6. Разместите на Form2:
      • 5 компонентов LabeledEdit (название расположить слева: свойство LabelPosition=lpLeft),
      компонент Button («ОК»).
      Кнопка «Добавить запись» становится видимой после отображения таблицы.
    7. Для кнопки «Добавить запись» написать в обработчике команду:
      Form2->Show();
      В обработчике кнопки «ОК» на Form2 прописать следующие команды:
      Form1->ADOTable1->Active = true;
      Form1->ADOTable1->Fields->Fields[0]->ReadOnly = false;
      Form1->ADOTable1->Fields->Fields[1]->ReadOnly = false;
      Form1->ADOTable1->Fields->Fields[2]->ReadOnly = false;

      Form1->ADOTable1->Insert();
      Form1->ADOTable1->Fields->Fields[0]->Value = Form1->ADOTable1->RecordCount + 1;
      Form1->ADOTable1->Fields->Fields[1]->Value = Form2->LabeledEdit1->Text;

      Form1->ADOTable1->UpdateBatch();//применение обновлений
      Form1->ADOTable1->Refresh();
    8. *Добавьте команды проверки корректности добавляемых данных:

1. Фамилия должна записываться маленькими буквами, а начинаться с большой буквы.
2. После фамилии должен быть один пробел.
3. Инициалы записываются без пробела, большими буквами с точкой после них.
4. Дата рождения имеет формат: 2 цифры, точка, 2 цифры, точка, четыре цифры. Проверить корректность даты (месяц от 1 до 12, день от 1 до (28, 29, 30,31), год от 1900 до 2000).
5. Пол содержит одну букву: «м» или «ж».
6. Год присвоения звания — число из промежутка [1900..20..]. *Правую границу промежутка года можно получать из текущей даты.
7. При несоблюдении формата выдавать соответствующее сообщение.

3. Для проекта из примера 19.16 добавьте следующие возможности:

    1. Добавьте кнопки «Сохранить Запрос» и «Загрузить Запрос» (используя диалоги работы с файлами).
    2. Создайте и сохраните 3 запроса:
      1. С полями Название и Денежная единица, отображающий страны, у которых денежная единица евро.
      2. С полями Название и Язык, отображающий страны, у которых название языка начинается с букв 'а' или 'н'.
      3. Реализуйте свой запрос (составной, одно из полей должно быть числовым).
    3. Добавьте кнопку «Запрос 2» и текстовое поле. Реализуйте запрос для поиска стран, первые буквы названий которых введены в текстовое поле.
    4. Добавьте кнопку «Запрос 3», выпадающий список и текстовое поле. В выпадающем списке поместите знаки «>, <, =». Реализуйте запрос для поиска стран, площадь которых — значения (>, <, =), введенного в текстовое поле.
    5. Добавьте кнопку «Запрос 4», и два списка. В первый список поместите названия полей, во второй — слова «возрастание», «убывание». Реализуйте запрос, который сортирует таблицу согласно выбранным критериям.