Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Применение ADO для работы с БД (C++ Builder)

Автор: Казанцев Владимир Витальевич
revenge@mail.kz, Казахстан, г.Алматы

Введение

Программирование баз данных является одним из наиболее приоритетных и востребованных направлений в сфере разработки программного обеспечения. Как вы наверно знаете, существует огромное множество, как самих сред создания приложений, так и универсальных СУБД со встроенным языком (зачастую высокого уровня). Это и Borland Delphi, и Microsoft Visual Studio, и C++ Builder, и Visual FoxPro, и многие другие. Каждый из таких продуктов содержит широкой набор компонентов, методов и процедур для обработки сложнейших структурированных систем данных.

Использование так называемых RAD-систем, т.е. систем мгновенной разработки приложений, значительно ускоряет процесс разработки и является более простым и выгодным способом, нежели использование иных сред. К примеру, возьмем Microsoft Visual Studio 2005. В ней реализовано как использование готовых компонентов (MFC) и добавление своих, так и создание приложений с нуля, т.е. программисту придется вручную предусматривать обработку сообщений операционной системы, создавать GUI интерфейс вручную на основе WinAPI функций. Видите насколько тяжелым становиться разработка конечного проекта! Поэтому применение RAD-систем оправданно с точки зрения времени создания проекта, а также простоты разработки.

Вот почему я рекомендую вам использовать Borland C++ Builder. Он очень прост в освоении, является полным аналогом IDE Delphi, только для использования языка C++, а множество компонентов для работы с базами данных делают ее просто отличной средой для разработки ПО. Конечные файлы имеют малый размер (в отличие от Delphi, где скомпилированные проекты, использующие VCL, занимают не менее 398 Кб).

Перечислим все необходимые для изучения инструменты:

  • Borland C++ Builder (версии 6 или же подойдет BDS 2006, разница небольшая);
  • Microsoft Office Access (любой версии, желательно не ниже 2000);

ActiveX Data Object

Во всех учебниках и пособиях дается подробное описание архитектуры, структуры ADO поэтому я считаю не стоит останавливаться на этом. А вот практических примеров, а уж тем более работоспособных очень мало и на вес они золото. Существует множество аналогичных примеров на Delphi и для знающих людей не составит проблемы портировать это на код языка C++. Но что если это затруднительно, а уж тем более для начинающих программистов?

Итак, приступим!

Создайте в программе Access какую-нибудь простенькую базу данных с одной или несколько таблиц. Надеюсь вы знаете как это делать. Если нет, то советую почитать книгу "Microsoft Office Access для чайников", очень хорошая книга.

Все компоненты для работы с ActiveX Data Object (ADO) находятся на закладке под одноименным названием. Для начала нам понадобится поместить на форму компонент TADOConnection - именно он будут отвечать за связь нашего приложения с физической базой данных. Далее не забудьте поместить и TDataSource - без него мы не сможем графически отобразить данные, он необходим для связи Data Controls компонентов с компонентом TADOTable, который тоже поместите на форму (он нужен для связи с конкретной таблицей БД, аналогично TTable из BDE).

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

  1. У компонента TADOTable установить свойство Connection в положенный на форму компонент TADOConnection (По-умолчанию это ADOConnection1);
  2. Свойство DataSet компонента TDataSource установите в ADOTable1;

Все теперь мы настроили три компонента на работу друг с другом.

Настало время установить соединение с БД, но для начала его нужно настроить. Выберите компонент TADOConnection, дважды щелкните по нему. В появившемся окне выберите "Use connection string" и нажмите Build. В ответ вам предложат выбрать драйвер для работы с базой. Хочу сразу вас обрадовать: в стандартную поставку Windows входят все необходимые драйвера, поэтому вам не нужно будет таскать с собой дистрибутив как в случае с BDE.

Так как мы будем работать с БД стандарта MDB от Access, то выберите драйвер Microsoft Jet 4.0 OLE DB и нажмите далее. Укажите путь к вашей базе данных и если вы установили контроль доступа к файлу, то введите имя пользователя и пароль.

На вкладке "Дополнительно" устанавливаются режим доступа к файлам и параметры сети, но в нашем случае последнее недоступно.

Теперь можете нажать OK и все настройки сохраняться в свойстве компонента TADOConnection под названием ConnectionString типа String.

Проверить есть ли соединение с базой данных можно установив свойство Connected (этого же компонента) в true.

Если IDE не выкинет никакой ошибки значит вы все настроили правильно и можно продолжать работу, если нет, то повторите все вышеописанные шаги.

Если вы не хотите, чтобы при соединении программа автоматически спрашивала пароль и пользователя доступа к файлу БД, то для этого есть свойство TADOConnection.LoginPrompt. Установите его в false.

Теперь выберите компонент TADOTable и укажите в свойстве TableName имя желаемой для работы таблицы из созданной вами базы данных (проверьте наличие true в свойстве TADOConnection.Connected). И напоследок, чтобы компонент получил доступ к базе данных, используя ADOConnection установите Active=true (TADOTable).

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

Data Controls и другие:

Для графического, наглядного отображения содержимого таблицы предусмотрены компоненты с закладки "Data Controls". Всего их 15, но оговорюсь, это зависит от поставки. Но можно также использовать и сторонние компоненты, если вам недостаточно функциональности стандартных.

  • TDBGrid - используется для табличного отображения данных (к примеру, как в Excel'е);
  • TDBNavigator - это набор из обычных кнопок расположенных на единой панели, позволяют манипулировать положением курсора, добавление строчек, удаление и т.д.
  • TDBText - является аналогом компонента TLabel, но позволяет устанавливать текст из определенного столбца БД;
  • TDBEdit - аналогично TDBText, но уже для TEdit. Кстати данные можно вводить и вручную.
  • TDBMemo - многострочный редактор текста.
  • TDBImage - позволяет отображать графические изображения, содержащиеся в файле базы данных.
  • TDBListBox - позволяет выбирать значение из списка имеющихся.
  • TDBComboBox - является сочетанием TDBEdit и TDBListBox, только используется ниспадающий список.
  • TDBCheckBox - активировать/деактивировать одно значение для строки.
  • TDBRadioGroup - совокупность компонентов TRadioButton.
  • TDBLookUpList - список значений, подобранных из другого столбца или другой таблицы;
  • TDBLookUpComboBox - аналогично TDBLookUpList.
  • TDBRichEdit - аналогично TDBMemo, но имеет возможность более детального отображения и редактирования (цвет, размер).
  • TDBCtrlGrid - отображает записи таблицы;
  • TDBChart - как вы уже поняли, данный компонент мы будем использовать для построения графиков, одно- и много- серийных.

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

Соединение графических компонентов с физической базой данных осуществляется путем использования промежуточного звена - компонента TDataSource, мы говорили о нем ранее. Для этого у каждого компонента есть свойство DataSource, выделенное красным в "Инспекторе Объектов". Установите в это свойство DataSource1 (если вы полностью следовали данному руководству), или же выберите из ниспадающего списка.

Теперь, если свойство Active вашего TADOTable стоит в положении true, а TADOConnection.Connected=true. То в нашем компоненте немедленно отобразится содержимое физической базы данных.

Имея большой опыт в программирование различных СУБД и баз данных, советую вам использовать в своих приложениях 2 типа (точнее возможности) управления данными:

  • Табличный режим (DBGrid, DBNavigator) - поместите на форму эти два компонента, свяжите и у вас есть отличное орудие для редактирования;
  • Режим формы (DBListBox, DBEdit и др.) - если вы считаете, что табличный режим не удовлетворяет всех ваших желаний или же если того велит закачки;

Программирование компонента TADOTable

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

Для начала поиск. Для этого у компонента TADOTable предусмотрено множество функций:

TADOTable.Locate(const AnsiString KeyFields, const System::Variant &KeyValues, TLocateOptions Options); Ищет в ключевом поле, заданном в переменной KeyFields, значение переменной KeyValues. В случае если совпадение найдено, найденная запись становится текущей, т.е. курсор устанавливается на нее. В переменной Options указывается как преобразовывать значения для поиска может быть: loCaseInsensitive или loPartialKey.

TADOTable.Seek(const Variant &KeyValues, TSeekOption SeekOption =soFirstEQ); Используется при поиске с помощью индексов. SeekOption определяет как поступать если запись найдена: soFirstEQ, soLastEQ, soAfterEQ , soAfter, soBeforeEQ, soBefore. Подробное описание их вы найдете в мануале по Delphi.

TADOTable.LookUp (const AnsiString KeyFields, const Variant &KeyValues, const AnsiString ResultFields); Возвращает в качестве результата набор типа Variant со значениями всех найденных значений, удовлетворяющих запросу.

Существует еще несколько способов поиска информации в таблице: перебор всех элементов вручную, использование FindFirst, Next и т.д. Но мы перечислили только основные и необходимые, на мой взгляд, методы.

Приведем пример использования метода Locate. Поместите на форму компонент TComboBox, TButton и TEdit, занесите в КомбоБокс названия всех полей вашей таблицы (для этого используется свойство Items). В Edit мы будем вводить значение необходимое для поиска, а из ComboBox выбирать поле, по которому осуществлять поиск.

Теперь дважды щелкните по Button или выберите событие OnClick в инспекторе объектов.

Впишете в него следующий код:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 ADOTable1->Locate(ComboBox1->Text,Edit1->Text,[loCaseInsensitive]);
//здесь по указанному в Combo полю ищем значении из Edit. Все просто
//loCaseInsensitive - это поиск без ориентации на строчные и прописные буквы
}

Видите, для организации простого поиска достаточного всего одной строчки кода.

Настало время добавить в наш проект фильтрацию. Добавить еще один TEdit и TButton на форму. Для понимания принципа этого будет достаточно. И разберите вот этот код:

void __fastcall TForm1::Button2Click(TObject *Sender)
{
 ADOTable1->Filtered=false;      // Отменяем предыдущую фильтрацию если была
 ADOTable1->Filter=Edit2->Text;  // Выставляем критерий фильтрации
 ADOTable1->Filtered=true;       // И снова включает фильтрацию
}

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

<имя поля> |параметр (=,>,<,>=,<= и т.д.)| <значение>

Вот пример:

ФИО = Иванов Иван Петрович

В результате в таблице останутся только записи где, поле ФИО имеет значение "Иванов Иван Петрович" без внесения физических изменений в таблицу.

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

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

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
99K
01 февраля 2018 года
Ande Dezan
0 / / 01.02.2018
Мне нравитсяМне не нравится
1 февраля 2018, 15:51:40
Да. Не рабочий поиск
2.
95K
27 марта 2015 года
Marat “Agul” Agasiev
0 / / 27.03.2015
+4 / -0
Мне нравитсяМне не нравится
27 марта 2015, 15:54:07
Ставлю фильтр по примеру в статье, выдает ошибку "Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом". Не подскажете в чем дело?
3.
90K
11 апреля 2013 года
ShaxloShka Ar
0 / / 11.04.2013
+2 / -1
Мне нравитсяМне не нравится
11 апреля 2013, 10:56:20
спасибо
4.
71K
09 мая 2011 года
GlazMira
0 / / 09.05.2011
+4 / -4
Мне нравитсяМне не нравится
9 мая 2011, 17:32:53
Инфа очень помогла с курсовой.
Через ADODataSet подключить БД неполучалось
5.
63K
30 августа 2010 года
SHTORM2011
0 / / 30.08.2010
+12 / -1
Мне нравитсяМне не нравится
30 августа 2010, 17:52:35
пропиши так:
TLocateOptions loCaseInsensitive;
loCaseInsensitive.Clear();
ADOTable1->Locate(ComboBox1->Text,Edit1->Text,loCaseInsensitive);
6.
58K
21 февраля 2010 года
skrup1
0 / / 21.02.2010
+6 / -5
Мне нравитсяМне не нравится
21 февраля 2010, 17:01:05

поистк чет неработает пишит ошибку : expression sintax
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог