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

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;

}

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