Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 июля!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Возможности языков семейства Си по истине безграничны, однако, в этой свободе кроются и недостатки: всегда нужно программисту держать ухо востро и контроллировать "переполнение буфера", чтобы потом программа не вылетала в "синий экран" на массе разнообразных версий Windows и железа у пользователей. Те же крэкеры и реверсеры специально ищут в коде программ на Си уязвимости, куда можно подсадить любой вирусный код, об этом более подробно автор рассказывал в своём видеокурсе здесь. Я там многое узнал и теперь мой код стал значительно более безопасный.
C++ Builder
Работа с базами данных в Borland C++ Builder


Введение

Используя Borland C++ Builder, можно создать приложения, работающие как с однопользовательскими базами данных (БД), так и с серверными СУБД, такими как Oracle, Sybase, Informix, Interbase, MS SQL Server, DB2, а также с ODBC-источниками. Возможности C++ Builder, связанные с созданием приложений, использующих базы данных, весьма обширны для того, чтобы описать их в одной статье. Поэтому сегодня мы рассмотрим лишь простейшие возможности работы с таблицами баз данных.

Набор данных в C++ Builder - это объект, состоящий из набора записей, каждая из которых, в свою очередь, состоит из полей, и указателя текущей записи. Набор данных может иметь полное соответствие с реально существующей таблицей или быть результатом запроса, он может быть частью таблицы или объединять между собой несколько таблиц.


Набор данных в C++ Builder является потомком абстрактного класса TDataSet (абстрактный класс - это класс, от которого можно порождать другие классы, но нельзя создать экземпляр объекта данного класса). Например, классы TQuery, TTable и TStoredProc, содержащиеся на странице палитры компонентов Data Access, - наследники TDBDataSet, который, в свою очередь, является наследником TDataSet. TDataSet содержит абстракции, необходимые для непосредственного управления таблицами или запросами, обеспечивая средства для того, чтобы открыть таблицу или выполнить запрос и перемещаться по строкам.


Компонент TDataSource

Компонент DataSource действует как посредник между компонентами TDataSet (TTable, TQuery, TStoredProc) и компонентами Data Controls - элементами управления, обеспечивающими представление данных на форме. Компоненты TDataSet управляют связями с библиотекой Borland Database Engine (BDE), а компонент DataSource управляет связями с данными в компонентах Data Controls.

В типичных приложениях БД компонент DataSource, как правило, связан с одним компоненом TDataSet (TTable или TQuery) и с одним или более компонентами Data Controls (такими, как DBGrid, DBEdit и др.). Связь этого компонента с компонентами TDataSet и DataControls осуществляется с использованием следующих свойств и событий:

       
  • Cвойство DataSet компонента DataSource         идентифицирует имя компонента         TDataSet. Можно присвоить значение         свойству DataSet на этапе         выполнения или с помощью         инспектора объектов на этапе         проектирования.    
  • Cвойство Enabled компонента DataSource         активизирует или         останавливает взаимосвязь         между компонентами TDataSource и Data         Controls. Если значение свойства         Enabled равно true, то компоненты Data         Controls, связанные с TDataSource,         воспринимают изменения набора         данных. Использование свойства         Enabled позволяет временно         разъединять визуальные         компоненты Data Controls и TDataSource,         например, для того, чтобы в         случае поиска в таблице с         большим количеством записей не         отображать на экране         пролистывание всей таблицы.    
  • Свойство AutoEdit компонента DataSource         контролирует, как инициируется         редактирование в компонентах         Data Controls. Если значение свойства         AutoEdit равно true, то режим         редактирования начинается         непосредственно при получении         фокуса компонентом Data Controls,         связанным с данным компонентом         TDataSet. В противном случае режим         редактирования начинается,         когда вызывается метод Edit         компонента TDataSet, например,         после нажатия пользователем         кнопки Edit на компоненте DBNavigator.         · Событие OnDataChange компонента         DataSource наступает, когда         происходит изменение значения         поля, записи, таблицы, запроса.    
  • Cобытие OnUpdateData компонента         DataSource наступает, когда         пользователь пытается         изменить текущую запись в TDataSet.         Обработчик этого события         следует создавать, когда         требуется соблюсти условия         ссылочной целостности или         ограничения, накладываемые на         значения полей изменяемой базы         данных.

Компонент TTable

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

       
  • Active - указывает, открыта (true) или         нет (false) данная таблица.    
  • DatabaseName - имя каталога,         содержащего искомую таблицу,         либо псевдоним (alias) удаленной         БД (псевдонимы устанавливаются         с помощью утилиты конфигурации         BDE, описание которой         присутствует во многих         источниках, посвященных         продуктам Borland, либо с помощью         SQL Explorer, вызываемого с помощью         пункта меню Database/Explore). Это         свойство может быть изменено         только в случае, если таблица         закрыта (ее свойство Active равно         false), например:
     Table1->Active = false;
     Table1->DatabaseName = "BCDEMOS"
     Table1->Active = true;
           
  • TableName - имя таблицы.    
  • Exclusive - если это свойство         принимает значение true, то         никакой другой пользователь не         может открыть таблицу, если она         открыта данным приложением.         Если это свойство равно false         (значение по умолчанию), то         другие пользователи могут         открывать эту таблицу.    
  • IndexName - идентифицирует         вторичный индекс для таблицы.         Это свойство нельзя изменить,         пока таблица открыта.    
  • MasterFields - определяет имя поля         для создания связи с другой         таблицей.    
  • MasterSource - имя компонента TDataSource,         с помощью которого TTable будет         получать данные из связанной         таблицы.    
  • ReadOnly - если это свойство равно         true, таблица открыта в режиме         "только для чтения".         Нельзя изменить свойство ReadOnly,         пока таблица открыта.    
  • Eof, Bof - эти свойства принимают         значение true, когда указатель         текущей записи расположен на         последней или соответственно         первой записи таблицы.    
  • Fields - массив объектов TField.         Используя это свойство, можно         обращаться к полям по номеру,         что удобно, когда заранее         неизвестна структура таблицы:
     Edit1->Text=Table1->Fields[2]->AsString; 
       

Наиболее часто при работе с компонентом TTable используются следующие методы:


       
  • Open и Close устанавливают значения         свойства Active равными True и False         соответственно.    
  • Refresh позволяет заново считать         набор данных из БД.    
  • First, Last, Next, Prior перемещают         указатель текущей записи на         первую, последнюю, следующую и         предыдущую записи         соответственно, например:
     Table1->First();
     while (!Table1->Eof)
     {
     //что-то делаем...
     Table1->Next();
     };
           
  • MoveBy перемещает указатель на         указанное число строк (оно         может быть и отрицательным) в         пределах таблицы    
  • Insert, Edit, Delete, Append - переводят         таблицу в режимы вставки         записи, редактирования,         удаления, добавления записи         соответственно.    
  • Post - осуществляет физическое         сохранение измененных данных.         Например:
     Table2->Insert();
     Table2->Fields[0]->AsInteger = 100;
     Table2->Fields[1]->AsString =Edit1->Text;
     Table2->Post();
           
  • Cancel - отменяет внесенные         изменения, не сохраненные         физически.    
  • FieldByName - предоставляет         возможность обращения к данным         в полях по имени поля:
     S=Table1->FieldByName("area")->AsString; 
           
  • SetKey переключает таблицу в         режим поиска.    
  • GotoKey начинает поиск строки,         значение Fields[n] которой равно         выбранному, где n - номер         колонки таблицы, начиная с 0:
     Table1->SetKey();
     Table1->Fields[0]->AsString=Edit1->Text;
     Table1->GotoKey();
           
  • SetRangeStart, SetRangeEnd, ApplyRange позволяют         выбрать нужные строки на         основе диапазона значений         какого-либо поля.
     Table1->SetRangeStart();
     Table1->Fields[0]->AsString = Edit1->Text;
     Table1->SetRangeEnd();
     Table1->Fields[0]->AsString = Edit2->Text;
     Table1->ApplyRange();
           
  • FreeBookmark, GetBookmark, GotoBookmark-         позволяют создать помеченную         строку в таблице и затем         вернуться к ней позже. Методы         Bookmark используют класс TBookmark.         Метод GetBookmark устанавливает         закладку на текущей cтроке         таблицы. GotoBookmark осуществляет         перемещение в таблице к строке,         ранее отмеченной закладкой.         Метод FreeBookmark используется для         уничтожения объекта типа TBookmark:        
     TBookmark Marker =Table1->GetBookmark();
     Table1->GotoBookmark(Marker);
     Table1->FreeBookmark(Marker);
       

Cобытия компонента TTable позволяют строить и контролировать поведение приложе ий БД. Например, событие BeforePost наступает перед вставкой или изменением записи, событие AfterPost - после сохранения вставленной или измененной записи, событие AfterDelete - после удаления записи и т.д.


Чтобы внести компонент TTable в форму, нужно выполнить следующее:


       
  1. Используя страницу Data Access         палитры компонентов,         разместить компонент TTable на         форме или в модуле данных.    
  2. Свойству DatabaseName присвоить имя         каталога, где находится БД,         либо псевдо има БД.    
  3. Свойству TableName присвоить имя         таблицы или выбрать таблицу из         выпадающего списка.    
  4. Внести в форму компонент DataSource         и установить значение свойства         DataSet равным имени компонента         TTable.    
  5. Внести компоненты Data Controls и         связать их с компонентом DataSource         для того, чтобы отобразить на         экране данные из таблицы БД.

Компонент TField

Объекты класса TField являются свойством объекта TDataSet (напомним, что некоторые свойства объектов сами являются объектами с их собственными наборами свойств, и TField - один из них).

Свойство Fields объекта типа TDataSet позволяет обращаться к отдельным полям набора данных. Свойство Fields является массивом или набором объектов TField, динамически создающимся во время выполнения приложения. Элементы массива соответствуют колонкам таблицы.

Объект TField не делает никаких предположений относительно типов данных, с которыми он связан. Он имеет несколько свойств, позволяющих установить или вернуть обратно значения поля, например, AsString, AsBoolean, AsFloat, AsInteger. Наиболее часто используются свойства Text (cтрока текста, выводимого в связанный с данным полем интерфейсный элемент) и FieldName (имя поля базы данных).

Fields Editor позволяет создать так называемый статический список полей таблицы, добавляемых к описанию класса формы. Когда впервые используются такие компоненты TDataSet, как компонент TTable или TQuery, список полей для них динамически генерируется в процессе выполнения приложения на основе имеющихся столбцов таблиц или результатов SQL-запроса. Fields Editor позволяет определить и затем модифицировать статический список компонентов Field на этапе проектирования приложения. При внесении колонок с использованием Fields Editor для каждого из полей, добавленных к TDataSet, возникают объекты TField, после чего можно увидеть эти поля в инспекторе объектов и использовать в приложениях их свойства, события и методы.

Использовать Fields Editor нужно следующим образом:

       
  1. Разместить компонент TTable или         TQuery на форме.    
  2. Установить свойство DatabaseName для         TTable или TQuery.    
  3. Установить свойство TableName         компонента TTable или свойство SQL         компонента TQuery.    
  4. Выбрать компонент TDataSet на         форме и нажать правую клавишу         мыши, после чего появится         контекстное меню.    
  5. Из контекстного меню выбрать         Fields Еditor. Появится пустое окно с         заголовком, совпадающим с         именем компонента TTable.    
  6. Снова нажать правую клавишу         мыши над пустым окном и из         контекстного меню выб ать         опцию Add Fields.
    Имена всех         колонок таблицы или запроса         появятся в диалоговой панели Add         Fields (рис. 1.)

           

           
    Рис.1. Формирование         списка полей

       
       
  7. Выбрать поля, которые нужно         внести в список объектов, и         нажать OK.

           
    Рис. 2.         Сформированный список полей,         доступных на этапе         проектирования

       
       
  8. Если требуется создать         вычисляемое поле на основе         имеющихся полей, нажать правую         клавишу мыши и из контекстного         меню выбрать New Field для создания         нового поля на основе         существующего или для создания         вычисляемого поля (в         дальнейшем следует создать код         обработчика события OnCalcFields         компонента TTable, где и         производятся необходимые         вычисления).    
  9. Если необходимо удалить         статическое поле из списка         полей в наборе данных, нужно         нажать правую клавишу мыши и из         контекстного меню выбрать Delete.

После того, как в Fields Editor добавлены поля, они появятся в инспекторе объектов, а ссылки на них - в h-файле формы.


Если теперь применить операцию drag-and-drop к выделенным в Fields Editor полям, перенеся их на форму, то можно получить готовую форму с необходимым набором интерфейсных элементов (в нашем случае - DBEdit, позволяющий отображать и редактировать строковые, числовые, денежные и другие поля, чьи значения представимы в виде строки символов, и DBImage, позволяющий отображать графические поля и использовать Clipboard для их редактирования). Если к такой форме добавить компонент TDBNavigator (этот компонент реализует основные методы TTable и TQuery, связанные с редактированием данных) и связать его с имеющимся компонентом TDataSource, а затем скомпилировать проект, получим приложение для просмотра и редактирования данных в таблице.




Рис. 3. Результат переноса на форму полей из Fields Editor


При работе Fields Editor создаются объекты, соответствующие видимым в инспекторе объектов полям. Эти объекты являются потомками объектного типа TField. Таблица 1 описывает существующие классы таких объектов:


Таблица 1. Потомки TField

ПотомокОписание
TStringField Текстовые данные фиксированной длины до 8192 символов.
TAutoIncField Целые числа от -2,147,483,648 до 2,147,483,647. Предназначен для нумерации строк в наборе данных. Потомок TIntegerField.
TIntegerField Целые числа от -2,147,483,648 до 2,147,483,647.
TSmallIntField Целые числа от -32768 до 32767.
TWordField Целые числа от 0 до 65535.
TFloatField Действительные числа с абсолютной величиной от 1.2x10e-324 до 1.7x10e308 с точностью до 15-16 цифры.
TCurrencyField Действительные числа с абсолютной величиной от 1.2x10e-324 до 1.7x10e308 с точностью до 15-16 цифры.
TBooleanField Значения true или false.
TDateTimeField Значения даты и времени.
TDateField Значения даты.
TTimeField Значения времени.
TBlobField Произвольное поле данных без ограничений размера.
TBytesField Произвольное поле данных без ограничений размера.
TVarBytesField Произвольное поле данных до 65535 символов с фактической длиной, представленной в первых двух байтах.
TMemoField Текст произвольной длины.
TGraphicField Графическое поле произвольной длины, например, битовый массив.

Компонент TDBGrid

Компонент TDBGrid обеспечивает табличный способ отображения на экране строк данных из компонентов TTable или TQuery. Приложение может использовать TDBGrid для отображения, вставки, уничтожения, редактирования данных БД. Обычно DBGrid используется в сочетании с DBNavigator, хотя можно использовать и другие интерфейсные элементы, включив в их обработчики событий методы First, Last, Next, Ptior, Insert, Delete, Edit, Append, Post, Cancel компонента TTable.

Внешний вид таблицы (например, надписи в заголовках столбцов) может быть изменен с помощью редактора свойств Columns Editor. Для вызова Columns Editor нужно либо выбрать соответствующую опцию в контекстном меню компонента DBGrid или щелкнуть мышью в колонке значений напротив свойства Columns в инспекторе объектов.


Рис. 4. Установка свойств столбцов DBGrid с помощью Columns Editor

Вторым способом получения контроля над характеристиками DBGrid или другими компонентами является создание описанным выше способом статического набора компонентов TField. Имея компонент типа TField, созданный для каждого из полей в наборе данных, можно установить ширину, формат, маску, расположение, метку для отображения в DBGrid и другие характеристики.

Поля Float, Integer и Date обладают свойством DisplayMask. Это свойство можно использовать, чтобы форматировать данные в компоненте DBGrid или другом компоненте Data Controls. Например, экранный формат mm-dd-yy может использоваться для размещения полей типа дата.

Некоторые компоненты TField (например, TStringField) обладают свойством EditMask, которое можно установить, вводя данные в DBGrid и другие компоненты Data Controls. Для установки свойства EditMask нужно установить компонент Field в Object Inspector и выбрать свойство EditMask, после чего появится диалоговая панель Input Mask Editor, представленная на рис. 5. Чтобы проверить маску редактирования, нужно ввести значение в поле Test Input.


Рис. 5. Диалоговая панель Input Mask Editor

Пример 1. Разработка простейшего приложения

Попробуем создать простейшее приложение для редактирования таблицы БД. Для этого воспользуемся таблицей COUNTRY базы данных BCDEMOS, содержащейся в комплекте поставки C++ Builder.

Создадим новый проект и сохраним его главную форму как COUNT1.CPP, а сам проект как COUNT.MAK. Используя страницу Data Access палитры компонентов, разместим компоненты TTable и DataSource на форме. Установим свойство Database Name компонента Table1 равным BCDEMOS, свойство TableName равным COUNTRY.DB, а свойство Active равным true. Далее установим значение свойства DataSet компонента DataSource1 равным Table1.

Используя страницу Data Controls палитры компонентов, внесем компоненты DBGrid и DBNavigator в форму. Присвоим свойству DataSource обоих компонентов значение DataSource1.


Рис. 6. Главная форма приложения COUNT

Полученный проект можно скомпилировать и протестировать.

Отметим, что есть и более простой способ построить подобное приложение. Для этой цели можно воспользоваться утилитой SQL Explorer, вызываемой с помощью пункта меню Database/Explore. Выбрав страницу Databases в левой части окна SQL Explorer и щелкнув на значке "+" возле имени соответствующей базы данных, нужно выбрать опцию Tables. Затем в правой части окна нужно выбрать закладку Summary и перетащить с помощью мыши значок с именем нужной таблицы (в нашем случае COUNTRY.DB) на пустую форму. На форме появятся компоненты TDBGrid, TDataSource и TTable. После этого следует добавить DBNavigator, связать его с TDataSource и сделать таблицу активной.


Рис. 7. SQL Explorer

Пример 2. Разработка приложения, использующего вычисляемое поле

Таблица, используемая в предыдущем примере, содержит поля Area (площадь в кв.км ) и Population (население). Попробуем создать вычисляемое поле, содержащее п отность населения стран, представленных в этой таблице. Для этого запустим Fields Editor для компонента Table1, внесем все поля этой таблицы в набор данных и создадим новое поле с названием pop2. Выберем Float в списке Field type. Убедимся, что выбрана радиокнопка Calculated, и щелкнем на кнопке OK


Рис. 8. Создание вычисляемого поля

Создадим обработчик события OnCalcFields компонента Table:

 Table1pop2->Value=Table1Population->Value/Table1Area->Value;
Установим значение свойства DisplayFormat компонента Table1Pop2 равным .## . Запустим и протестируем приложение и убедимся в том, что вычисляемое поле действительно присутствует.

Компоненты TDBLookup

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


C++ Builder предоставляет четыре компонента для просмотра и ввода значений в таблицы:


       
  • Компонент TDBLookupListBox (страница         Data Controls)    
  • Компонент TDBLookupComboBox(страница         Data Controls)    
  • Компонент TDBLookupList (страница Win         3.1)    
  • Компонент TDBLookupCombo(страница Win         3.1)
Последние два компонента присутствуют в палитре компонентов с целью совместимости с формами, созданными в версии Delphi 1.0 (как известно, в C++ Builder можно использовать формы Delphi 1.0 и 2.0).

Компоненты DBLookupList и DBLookupListBox являются похожими на ListBox компонентами, созданными для просмотра значения в одной таблице, основанного на значении в другой таблице. DBLookupList и DBLookupListBox содержат конечный набор значений. Когда DBLookupList и DBLookupListBox используются для ввода данных, пользователь должен выбрать один вариант из списка. DBLookupList и DBLookupListBox позволяют вывести на экран набор вариантов, основанных на значении в другой таблице.

Компоненты DBLookupList и DBLookupListBox отличаются от компонента DBListBox тем, что позволяют согласовать выбранное значение из списка с текущей строкой другой таблицы БД, тогда как для DBListBox список значений для выбора определен заранее и не имеет отношения к таблицам БД.

Компоненты DBLookupCombo и DBLookupComboBox являются похожими на ComboBox компонентами, то есть они похожи на DBLookupList и DBLookupListBox, за исключением того, что пользователь может либо выбирать значение в списке, либо вводить новое значение. ComboBox, на который похожи DBLookupCombo и DBLookupComboBox, сочетает в себе возможности ListBox с возможностями компонента Edit. DBLookupCombo и DBLookupComboBox отличаются от компонента ComboBox тем, что позволяют согласовать выбранное значение с текущей строкой другой таблицы БД. При размещении компонентов DBLookupList, DBLookupListBox, DBLookupCombo или DBLookupComboBox на форме эта форма в приложении должна содержать DataSource и компонент - потомок TDataSet (например, TTable).

Пример 3. Разработка приложения, использующего компонент просмотра баз данных

В этом примере рассматривается связь таблиц CUSTOMER (компании-заказчики) и ORDERS (их заказы) из базы данных BCDEMOS и используется компонент DBLookupListBox для того, чтобы отобразить на экране имя компании, соответствующее значению CustID, находящемуся в таблице ORDERS.

Чтобы создать форму для выведения на экран выбранных из таблицы ORDERS полей, следует открыть новый проект и сохранить главную форму как DBLOOK1.CPP, а проект как DBLOOK.MAK. Далее нужно разместить на форме компоненты TTable, DataSource, DBGrid и DBNavigator. Далее следует присвоить свойству Database Name компонента Table1 значение BСDEMOS, свойству TableName - значение ORDERS.DB, а свойству Active - значение true. Свойству DataSet компонента DataSource1 присвоим значение Table1, а свойству AutoEdit - значение false. Свойству DataSource компонентов DBGrid1 и DBNavigator1 присвоим значение DataSource1. Далее используем Fields Editor, чтобы внести в набор данных Table1 поля OrderNo, CustNo, SaleDate, ItemsTotal, AmountPaid. Расположим поля в Fields Editor так, чтобы OrderNo был бы первым, а CustNo - вторым. Можно скомпилировать и сохранить это приложение, затем запустить и протестировать его.

Теперь внесем в приложение компонент DBLookupListBox и установим его свойство DataSource равным DataSource1, а свойство DataField равным CustNo. Поместим на форму новые компоненты TTable и DataSource. Установим свойство DatabaseName для компонента Table2 равным BCDEMOS, свойство TableName равным CUSTOMER.DB, а свойство Active равным true. Свяжем DataSource2 с Table2. Свяжем компонент DBLookupListBox1 с DataSource2, установив значение свойства ListSource компонента DBLookupListBox1 равным DataSource2, свойства KeytField равным CustNo, а свойства ListField равным Company. Можно скомпилировать и сохранить приложение, затем запустить и протестировать его.

В компоненте DBLookupListBox будет выделено название компании, соответствующее значению CustNo в текущей строке DBGrid (рис. 9). Можно использовать DBLookupListBox для выбора заказчика по имени, при этом в таблице Orders будет устанавливаться соответствующее значение CustNo.


Рис. 9. Приложение с компонентом DBLookupListBox.

В следующих статьях будет рассмотрено использование компонента TQuery и возможности создания и использования SQL-запросов в приложениях С++ Builder.



<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS