Поддержка bde в vcl
Для создания приложений, работающих с БД через BDE, в VCL предусмотрена группа компонентов, расположенная на закладке BDE палитры компонентов. Из представленных 8 компонентов для нас сейчас наибольший интерес представляют 2, а именно Database и Table.
Компонент Database представляет собой компонент, инкапсулирующий в себе базу данных в целом. С его помощью можно контролировать наличие доступа к базе данных из приложения, следить за ходом транзакций, а так же подключаться к клиент-серверным БД. Свойства этого компонента приведены в таблице 18.2.
Таблица 18.2. Свойства компонента Database |
||
Свойство |
Тип |
Описание |
AliasName |
String |
Определяет псевдоним BDE для подключения |
Connected |
Boolean |
Определяет, установлено или нет соединение с БД |
DatabaseName |
String |
Определяет имя БД, ассоциированное с данным компонентом |
Directory |
String |
Определяет рабочий каталог для БД Paradox или dBase |
DriverName |
String |
Определяет имя драйвера BDE для данной БД |
Exclusive |
Boolean |
Включает монопольный доступ к БД |
InTransaction |
Boolean |
Указывает, выполняется ли в данный момент транзакция |
KeepConnection |
Boolean |
Определяет, должно ли приложение оставаться подключенным к БД, когда активных соединений нет |
Params |
TStrings |
Определяет список дополнительных параметров для псевдонима BDE |
SessionName |
String |
Определяет имя сессии для данного компонента |
ReadOnly |
Boolean |
Включает режим доступа к данным только на чтение |
Пожалуй, наиболее важным свойством является DatabaseName: указав в качестве значения этого свойства один из уже определенных в BDE псевдонимов, мы получим готовый к использованию компонент. Еще одно свойство - Connected - отвечает за непосредственную установку связи с БД. Таким образом, указав в качестве значения свойства DatabaseName "DATA1", и установив свойство Connected в истину, мы подключимся к БД.
Довольно интересной особенностью компонента Database является возможность создания псевдонимов БД, действующих в рамках создаваемого приложения. Прежде всего, можно указать в качестве значения свойства Alias то же значение DATA1, выбрав его из списка, а в качестве DatabaseName указать какое-либо произвольное значение (например, MyData). Таким образом, для других компонент, имеющих свойство DatabaseName можно будет указывать MyData в качестве значения этого свойства.
В то же время, если бы у нас не был определен псевдоним DATA1, или же по каким-либо причинам нам не хотелось бы его использовать, то мы могли бы "с нуля" создать псевдоним для данного приложения. Для этого потребуется указать те же параметры, что и при создании псевдонима средствами BDE Administrator, а именно тип драйвера, путь к БД и собственно псевдоним. Код получится примерно таким:
Database1.DatabaseName:='MyData1'; // псевдоним Database1.DriverName:='STANDARD'; // драйвер Paradox Database1.Connected:=true; // активируем компонент Database1.Directory:='C:\Data'; // устанавливаем путь к файлам данных
Вместе с тем такое свойство, как DatabaseName предпочтительно все же задавать не во время выполнения, а в режиме разработки через инспектор объекта. Это позволит ссылаться на БД из других компонент, указывая в их свойстве DatabaseName, так же уже на этапе визуального проектирования приложения.
Одним из таких компонент, имеющим свойство DatabaseName, как раз и является Table. Если Database представляет собой базу данных в целом, то Table - это представление единичной таблицы из БД. Следует сразу отметить, что Table может обращаться к таблицам БД как через посредство компонента Database, ссылаясь на определенное в нем свойство DatabaseName, так и напрямую, если в свойстве DatabaseName компонента Table указать один из определенных в BDE псевдонимов. Разумеется, компонент Table имеет и другие свойства - они приведены в таблице 18.3.
Таблица 18.3. Свойства компонента Table |
||
Свойство |
Тип |
Описание |
Active |
Boolean |
Определяет, должно ли быть установлено подключение к базе данных |
CanModify |
Boolean |
Указывает, может ли приложение изменять содержимое таблицы Paradox или dBase |
DatabaseName |
String |
Определяет имя БД, ассоциированное с данным компонентом |
DataSource |
TDataSource |
Определяет имя объекта источника данных для использования данной таблицы в качестве подчиненной при связи типа главный-подчиненный |
DefaultIndex |
Boolean |
Определяет, должно ли производиться упорядочивание записей таблицы по первичному индексу |
Exclusive |
Boolean |
Включает монопольный доступ к данной таблице Paradox или dBase |
Exists |
Boolean |
Указывает, существует ли данная таблица в БД |
FieldDefs |
TFieldDefs |
Указывает на список полей, определяющих данные |
Filter |
String |
Определяет условие, по которому будет происходить выборка полей для показа |
Filtered |
Boolean |
Определяет, является ли фильтр включенным |
FilterOptions |
TFilterOptions |
Определяет набор флагов для фильтра |
IndexDefs |
TIndexDefs |
Предоставляет информацию о индексах таблицы |
IndexFieldCount |
Integer |
Указывает на количество полей, использованных в текущем индексе |
IndexFieldNames |
String |
Определяет список полей, используемых в качестве индекса (через запятую) |
IndexFields |
array of Tfield |
Список индексов таблицы |
IndexFiles |
TStrungs |
Определяет список файлов с индексами для таблиц dBase |
IndexName |
String |
Определяет вторичный индекс, по которому должно производиться упорядочивание (вместо первичного) |
MasterFields |
String |
Определяет список полей (через запятую) в главной таблице, по которым должна устанавливаться связь типа главный-подчиненный |
MasterSource |
TDataSource |
Определяет имя объекта источника данных для использования данной таблицы в качестве главной при связи типа главный-подчиненный |
SessionName |
String |
Определяет имя сессии для данного компонента |
ReadOnly |
Boolean |
Определяет режим доступа к таблице |
TableName |
String |
Определяет имя таблицы (имя файла для таблиц dBase или Paradox) |
TableType |
TTableType |
Определяет тип таблицы. Может принимать значения ttDefault (тип определяется по расширению файла), ttParadox, ttDBase, ttFoxPro и ttASCII |
Здесь следует оговориться, что на самом деле некоторые свойства лишь унаследованы компонентом Table от своих предков. Соответственно, мы можем их встретить и в других компонентах, связанных с БД. В частности, это свойство Active, унаследованное от класса TDataSet - общего предка всех БД-компонент, предоставляющих непосредственных доступ к данным. От этого же предка происходит и свойство FieldDefs, позволяющее самостоятельно настроить список обрабатываемых полей. А группа свойств, связанных с отбором данных (Filter, Filtered и FilterOptions) являются частью класса TBDEDataSet - наследника класса TDataSet, ориентированного на работу с базами данных посредством драйверов BDE.
Остановимся на свойстве FilterOptions, которое содержит 2 флага:
-
foCaseInsensitive - строки будут сравниваться без учета регистра символов;
-
foNoPartialCompare - символ "звездочка" (*) в поле фильтра будет интерпретироваться именно как символ, а не как шаблон подстановки.
Свойства фильтров используются только при работе с BDE, поскольку в SQL-ориентированных компонентах подразумевается, что отбор данных будет производиться при помощи запросов SQL, что, в общем-то, вполне естественно, учитывая предназначение и возможности самого SQL.
ПРИМЕЧАНИЕ Еще одно важное свойство - FieldDefs, являющееся списком объектов - полей TField, будет рассмотрено вместе с самими полями позже, в главе, посвященной непосредственной работе с данными.
Для использования таблицы достаточно указать значения для свойств DatabaseName и TableName. Например, если продолжить пример с созданием псевдонима для компонента Database, то после последней строчки кода, устанавливающей значение для свойства Directory, достаточно добавить:
Table1.DatabaseName:='MyData1'; // устанавливаем значение БД на псевдоним Table1.TableName:='Customer'; // в имени таблицы расширение не обязательно Table1.Active:=true; // делаем таблицу подключенной
Дальнейшее использование компонента Table чаще всего сводится к тому, что он, представляя собой таблицу БД, позволяет производить над ней ряд манипуляций, включая редактирование данных, перемещение по записям и т.д. Для этого используются методы, которых у компонента Table, с учетом всех наследований, имеется около сотни. Впрочем, многие из них нельзя назвать повседневно необходимыми. Из наиболее востребованных можно отметить методы First и Last, Next и Prior, используемые для навигации по записям таблицы, а так же Append, Delete и Insert, которые используются для добавления и удаления записей. Следует отметить, что все эти методы являются унаследованными от класса TDataSet, что говорит о том, что они имеются и у множества других предназначенных для работы с БД компонент.