Компоненты для работы находятся на панели 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):
- обеспечивающие реализацию технологии ADO;
- обеспечивающие визуализацию табличных данных;
- обеспечивающие связь между технологическими и визуальными компонентами.
Пример 19.9. Создать проект, который позволит просматривать таблицу базы данных.
Этапы выполнения задания
- Разместить на форме компоненты ADOTable и ADOConnection (палитра dbGo), DataSource (палитра Data Access). DBGrid и DBNavigator (палитра Data Controls), Button и LabeledEdit.
- Настроить соединение с базой данных Академики.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. На вкладке Соединение выбираем файл с базой данных.
- Установить для компонента ADOTable1 следующие значения свойств:
3.1. Connection — ADOConnection1. 3.2. TableName — выбрать из выпадающего списка имя таблицы: Члены-корреспонденты Академии наук Беларуси. 3.3. Active — true.
- Установить значение ADOTable1 для свойства DataSet компонента DateSource1.
- Установить значение DateSource1 для свойства DateSource компонентов DBGrid1 и DBNavigator.
- Настраиваем поля таблицы (пример 19.11):
6.1. Двойным щелчком по компоненту DBGrid1 (таблице) открываем список полей. 6.2. В появившемся списке поочередно выбираем каждое поле и в инспекторе объектов меняем свойство DisplayWidth (в зависимости от контекста). 6.3. Отключаем свойство Active у ADOTable1.
- Написать обработчик события onClick для кнопки (пример 19.12).
Одна из самых рапространенных операций, которая выполняется с таблицей БД — это построение запросов на поиск записей, удовлетворяющих условию. Для этого можно просмотреть все записи и проверить значения в соответствующих полях. Для посмотра записей таблицы используют методы компонента ADOTable: First, Last, Prior, Next, которые перемещают указатель текущей записи на первую, последнюю, следующую и предыдущую записи соответственно.
Для доступа к значениям полей используется свойство Filds, которое хранит массив значений полей. Обращение к каждому конктретному полю происходит по индексу.
Просмотр записей может осуществляться в цикле while с условием, пока не будет достигнут конец файла, или в цикле for по количеству записей в таблице.
Пример 19.13. Добавить в проект из примера 19.9 поиск по условию:
- количество ученых, получивших звание после введенного года;
- количество ученых, с указанной специализацией;
- самый ранний год присвоения звания;
- количество ученых, родившихся до введенной даты.
Этапы выполнения задания
- Добавить на форму компонент PageControl (компонент с вкладками).
- Из контекстного меню добавить две вкладки. Первую вкладку назвать «Таблица» и перенести на нее компоненты DBGrid, DBNavigator, Button и LabeledEdit.
- Вторую вкладку назвать «Поиск». Разместить на ней три LabeledEdit (для ввода условий), четыре компонента Button (для выполнения запроса) и четыре компонента Label (для размещения ответа).
- Написать обработчик 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;
}
|
Работающее приложение:
|