Main Page
Статьи Компоненты Ссылки Разное

Серия статей. Kylix Tutorial.

2. Работа с базами данных через dbExpress. Первые шаги.

Автор:  Mike Goblin

  Фирма Borland в Kylix и Delphi 6 реализовала новый движок для работы с базой данных dbExpress. Данный движок предназначен для работы с серверными БД. На сегодняшний день поддерживаются MySQL, Oracle, Interbase, DB2. К сожалению, на момент выпуска Kylix он работал не со всеми версиями MySQL. В частности, он не заработал с MySQL 3.23.22-beta. За неимением Oracle и DB2 я пользовался Interbase 6, находившемся на втором диске дистрибутива.

Архитектура доступа к данным

  В самом виде приложение для работы с базами данных может быть представлено в следующем виде:



  Ничего принципиально нового здесь нет, по сравнению с Delphi. Но это только на первый взгляд. В dbExpress датасеты делятся на два вида:
    1. Клиентский датасет (client dataset)
    2. Однонаправленные датасеты (unidirectional dataset)
  Клиентский датасет хранит выбранные записи в памяти. Это позволяет осуществлять навигацию в любом направлении, фильтровать записи, кешировать изменения итд. Именно данный вид используется для отображения данных пользователю.
  Однонаправленные запросы не кешируют данные. Передвигаться по ним можно только в направлении указанном в конструкции ORDER BY SQL запроса, данные не могут быть изменены. Однако они предоставляют быстрый доступ к большим массивам записей.

Компоненты закладки dbExpress

  Посмотрим, что приготовила нам фирма Borland по части компонентов на закладке dbExpress.
СвойстваОписание
SQLConnection
Компонент для организации связи с сервером базы данных. Аналог Database в BDE. Позволяет управлять параметрами соединения с сервером БД, такие как путь к базе данных, имя и пароль пользователя итд.
Connected:booleanПризнак установления соединения с БД. True - соединение активно.
ConnectionName: stringИмя конфигурации, содержащей параметры соединения. Аналог AliasName в TDatabase для BDE
DriverName: stringИмя драйвера для соединения. (DB2, Interbase,Oracle, MySQL). Устанавливается автоматически при установке св-ва ConnectionName
KeepConnection: booleanПоддерживать соединение с сервером БД, если в приложении нет активизированных датасетов.
LibraryName: stringИмя библиотеки, содержащей драйвер для связи с сервером БД
LoadParamsOnConnect: booleanЗагружать ли параметры соединения, ассоциированные с именем соединения, перед установкой соединения в run time. Полезно в случае когда параметры соединения могут быть изменены вне приложения или меняются в design time
LoginPrompt: BooleanЗапрашивать логин и пароль при соединении
Name: TComponentName Имя компонента
Params: TStringsПараметры соединения
TableScope: TTableScopesПараметры видимости таблиц
TsSynonym - видеть синонимы
TsSysTable - видеть системные таблицы
TsTable - видеть таблицы
TsView - видеть просмотры
VendorLib: stringИмя библиотеки с клиентской частью БД
SQLDataSet
Однонаправленный датасет общего назначения.
Active: booleanАктивность датасета
CommandText: stringТекст команды (запроса) на получение или манипуляции с данными
CommandType: TSQLCommandTypeТип датасета
CtQuery - SQL запрос
CtTable - таблица, автоматически генерируется запрос на выборку всех записей по всем полям
CtStoredProc - хранимая процедура
DataSource: TDataSourceИсточник данных для мастер датасета
MaxBlobSize: integerМаксимальный размер BLOB полей
ObjectView: BooleanВключить иерархическое представление для вложенных полей
ParamCheck:BooleanОбновлять список параметров при изменении текста команды
Params:TparamsСписок параметров команды
SortFieldNames: stringСписок полей для сортировки датасета, поля разделяются точкой с запятой. Действует для CommandType ctTable
SQLConnection: TSQLConnectionИмя компонента SQLConnection через который будет происходить работа с БД
Tag: integerТэг
SQLQuery
Запрос к БД (однонаправленный)
Active: booleanАктивность запроса
DataSource: TDataSourceИсточник данных для мастер датасета
MaxBlobSize: integerМаксимальный размер BLOB полей
ObjectView: BooleanВключить иерархическое представление для вложенных полей
ParamCheck:BooleanОбновлять список параметров при изменении текста запроса
Params:TparamsСписок параметров запроса
SQL:TStringsТекст запроса
SQLConnection: TSQLConnectionИмя компонента SQLConnection через который будет происходить работа с БД
Tag: integerТэг
SQLStoredProc
Хранимая процедура (в случае получения данных однонаправленная)
Active: booleanАктивность хранимой процедуры
MaxBlobSize: integerМаксимальный размер BLOB полей
ObjectView: BooleanВключить иерархическое представление для вложенных полей
ParamCheck:BooleanОбновлять список параметров при изменении процедуры
Params:TparamsСписок параметров процедуры
SQLConnection: TSQLConnectionИмя компонента SQLConnection через который будет происходить работа с БД
Tag: integerТэг
SQLTable
Таблица базы данных (однонаправленный датасет)
Active: booleanАктивность таблицы
IndexFieldNames: stringСписок полей сортировки (через точку с запятой)
IndexName: stringИмя индекса сортировки. Возможно использование либо IndexName или IndexFieldNames
MasterSource: TdataSourceМастер источник данных для организации отношений главный-подчиненный (master-detail)
MasterFields:stringПоля связи главный-подчиненный
MaxBlobSize: integerМаксимальный размер BLOB полей
ObjectView: BooleanВключить иерархическое представление для вложенных полей
SQLConnection: TSQLConnectionИмя компонента SQLConnection через который будет происходить работа с БД
TableName: stringИмя таблицы БД из которой будут выбраны данные
Tag: integerТэг
SQLMonitor
Организация наблюдения за работой компонентов доступа к данным
Active: booleanАктивность монитора
AutoSave: BooleanАвтоматическое сохранения журнала событий в файл, указанный в FileName
FileName: stringИмя файла для хранения журнала событий
SQLConnection: TSQLConnectionИмя компонента SQLConnection через который будет происходить работа с БД
Tag: integerТэг
TraceList:TstringsЖурнал событий
SQLClientDataSet
Клиентский датасет общего назначения
Active: booleanАктивность датасета
Aggregates: TaggregatesСписок доступных агрегатов
AggregatesActive: booleanВычисление агрегатов
AutoCalcFields: booleanГенерировать событие OnCalcFields и обновлять Lookup поля True -
· при открытии датасета
· при переходе датасета в состояни dsEdit
· Передача фокуса ввода другому компоненту или другому столбцу (для сетки) при наличии изменений в текущей ячейке
False
· при открытии датасета
· при переходе датасета в состояни dsEdit
· Запись извлекается из БД
CommandText: stringТекст команды для выполнения (SQL запрос). При установке св-ва FileName данное св-во игнорируется При сбросе флага poAllowCommandText в св-ве Options также текст команды игнорируется
CommandType: TSQLCommandTypeТип датасета
CtQuery - SQL запрос
CtTable - таблица, автоматически генерируется запрос на выборку всех записей по всем полям
CtStoredProc - хранимая процедура
ConnectionName: stringИмя конфигурации, содержащей параметры соединения. Аналог AliasName в TDatabase для BDE
Constraints: TConstraintsОграничения на значения на уровне одной записи
DBConnection: TSQLConnectionИмя компонента SQLConnection через который будет происходить работа с БД
DisableStringTrim: booleanУдалять конечные пробелы в строковых полях при их вставке БД
FetchOnDemand: booleanПолучать данные по мере необходимости
FieldDefs: TFieldDefsОпределения полей
FileName: stringИмя файла для сохранения кеша данных
Filter: stringФильтр
Filtered: BooleanВключение фильтрации
FilterOptions: TFilterOptionsПараметры фильтрации
IndexDefs: TindexDefsОпределения индексов
IndexFieldNames: stringСписок полей сортировки (через точку с запятой)
IndexName: stringИмя индекса сортировки. Возможно использование либо IndexName либо IndexFieldNames
MasterSource: TdataSourceМастер источник данных для организации отношений главный-подчиненный (master-detail)
MasterFields:stringПоля связи главный-подчиненный
ObjectView: BooleanВключить иерархическое представление для вложенных полей
Options: TProviderOptionsПараметры работы с данными
PacketRecord: integerКоличество записей в одном пакете данных
-1 - все
>0 - количество
0 - включать в пакет только метаданные
Params: TparamsЗначение параметров для выборки данных
ReadOnly: BooleanДоступ только для чтения
Tag: integerТэг
UpdateMode: TUpdateModeСпособ поиска записи при записи изменений
UpWhereAll - использовать все поля
UpWhereChanged - ключевые поля+старые значения измененных полей
UpWhereKeyOnly - только ключевые поля

  Попробуем написать простейшее приложение для просмотра данных из базы в /usr/ibdb (будем считать что папка уже создана). Для этого выполним следующие шаги:

1. Создадим базу данных в Interbase 6. У меня он проинсталировался в /opt/interbase .
1.1 Запустим сервер /opt/interbase/bin/ibguard &
1.2 Войдем в оболочку isql - /opt/interbase/bin/isql
1.3 Введем SQL запросы на создание БД и таблицы users:

create database '/usr/ibdb/test.gdb';
create table users( ID integer not null primary key, NAME varchar(20));
commit;
quit;
Если все выполнено правильно - то в папке /usr/ibdb появится файл test.gdb.
2. Создадим новое приложение. Меню File/NewApplication в IDE Kylix
3. На главной форме приложения разместим с закладки dbExpress компоненты: SQLConnection и SQLDataSet. SQLConnection - это "соедиение" с базой данных, т.е с его помощью можно управлять параметрами соединения, такими как тип драйвера, имя пользователя и пароль. Двойной щелчок левой кнопкой мыши на SQLConnection1 вызовет окно работы с соединениями. Окно представлено на рисунке




  Name - test_connect. После добавления установим следующие параметры:
  Database - /usr/ibdb/test.gdb
  ServerCharSet - win1251
  Кнопкой "ОК" закроем диалог. Свойство Connected установим в True. В диалоге запроса пароля введем пароль masterkey. Соединение установлено.
  Компонент SQLClientDataSet1 будет извлекать данные из таблицы users. Почему мы используем его а не SQLQuery? Ответ очень прост - SQLQuery - однонаправленный датасет. Поэтому он не может обеспечить навигации в обе стороны и редактирование данных.
  Свойство DBConnection компонента SQLClientDataSet1 установим равным SQLConnection1. Введем запрос на выборку данных из таблицы users - select * from users - в св-во CommandText, либо воспользуемся диалогом для данного св-ва. Активизируем запрос, установив св-во Active в True.
  Далее с закладки Data Access на форму положим компонент TDataSource. Данный компонент делает данные из датасетов доступными для отображения в пользовательских элементах управления (сетках итд). Его св-во DataSet установим в ClientDataSet1.
  Перейдем на закладку DataControls и с нее разместим на форме сетку данных DBGrid и DBNavigator. Для обоих компонентов св-во DataSource установим в DataSource1. При этом в DBGrid1 появится заголовок с наименованиями полей таблицы users. Вот что получилось у меня.




Теперь можно запустить приложение на выполнение (F9 однака).
Скачать пример (4кб)

P.S. Писалось на скорую руку. Посему возможны неточности и ошибки, о которых Вы можете сообщать мне по адресу mgoblin@mail.ru

Внимание! Запрещается перепечатка данной статьи или ее части без согласования с автором. Если вы хотите разместить эту статью на своем сайте или издать в печатном виде, свяжитесь с автором.
Автор статьи:  Mike Goblin   

Используются технологии uCoz